2014-10-05 155 views
0

我有这个代码块,它工作,但需要大约8秒钟执行。我知道这是第二个for循环,因为循环内有一个循环。但是,我相信我需要两个循环,因为我需要交叉引用tracks列表。Python for循环效率

有没有人知道一种方法来让这个函数更快执行?我似乎看不到另一种写作方式。

FYI:我正在使用的csv文件有5570行,这是函数采用“while”的另一个原因。

在此先感谢!

def load_library(filename) : 
    library = open(filename, 'rb') 
    reader = csv.reader(library, delimiter = '|') 
    tracks = set([]) 
    albums = set([]) 
    albums1 = set([]) 
    #albums1 is the set of albums which have already been added to the albums list. 

    for row in reader : 
     artist, track, album, genre, year = row 
     track = Track(artist, track) 
     track.set_album(album) 
     tracks.add(track) 

    library = open(filename, 'rb') 
    reader = csv.reader(library, delimiter = '|') 

    for row in reader : 
     artist, track, album, genre, year = row 
     a = Album(artist, album) 
     for i in tracks : 
      if str(i.album) == str(a.title) : 
       a.add_track(i.title) 
       if album not in albums1 : 
        albums.add(a) 
     albums1.add(album) 

    return tracks, albums 

使用c.Profile后:

cProfile.run( 'load_library()')在9.776秒

Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.002 0.002 9.776 9.776 <string>:1(<module>) 
    5570 0.001 0.000 0.001 0.000 musiclib.py:18(set_album) 
    11140 0.007 0.000 0.007 0.000 musiclib.py:23(__init__) 
    92784 0.028 0.000 0.037 0.000 musiclib.py:31(add_track) 
    5570 0.004 0.000 0.009 0.000 musiclib.py:6(__init__) 
     1 9.723 9.723 9.775 9.775 musiclib.py:71(load_library) 
     2 0.000 0.000 0.000 0.000 {_csv.reader} 
    16710 0.002 0.000 0.002 0.000 {method 'add' of 'set' objects} 
    92784 0.009 0.000 0.009 0.000 {method 'append' of 'list' objects} 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     2 0.000 0.000 0.000 0.000 {open} 
224565函数调用
+0

嗯,这是更快地使用'的ReadLine(line_num)'然后使用'for'循环通过每一行去。 – AHuman 2014-10-05 17:44:17

+0

试着用'cProfile'来分析它,看看哪些部分很慢。 – rlms 2014-10-05 17:52:00

+0

@AHuman谢谢,但是我会如何使用'readline(line_num)'来读取每一行? – 2014-10-05 17:52:10

回答

5

做了这一切只在一个for循环:

def load_library(filename) : 
    library = open(filename, 'rb') 
    reader = csv.reader(library, delimiter = '|') 
    tracks = set([]) 
    albums = {} 

    for row in reader : 
     artist, track, album, genre, year = row 
     if album not in albums: 
      a = Album(artist, album) 
      albums[album] = a 
     else: 
      a = albums[album] 
     a.add_track(track) 
     track = Track(artist, track) 
     track.set_album(album) 
     tracks.add(track) 
    return tracks, set(albums.values()) 
+0

谢谢!现在只需要0.705秒即可执行。 – 2014-10-05 18:13:07