您可以分析您的代码以了解瓶颈的位置。下面将创建一个名为“cart_stats.txt”的文件,其中包含分析信息。自己运行它似乎表明大部分时间都花在调用file.write()
.
from cProfile import Profile
from pstats import Stats
prof = Profile()
prof.disable()
file = open('cart_output.txt', 'wt')
def cart(n, seq):
import itertools
b = 8
while b < n:
n = n - 1
for p in itertools.product(seq, repeat=n):
file.write(''.join(p))
file.write('\n')
prof.enable()
cart(10, 'abc')
prof.disable()
prof.dump_stats('cart.stats')
with open('cart_stats.txt', 'wt') as output:
stats = Stats('cart.stats', stream=output)
stats.sort_stats('cumulative', 'time')
stats.print_stats()
file.close()
print 'done'
FWIW,缓慢似乎主要是由于对file.write()
自身的调用,因为即使我open()
输出具有巨大缓冲区的流或将其作为StringIO
实例,它仍然存在。通过优化和最小化对它的调用,我能够显着减少这种情况,如下所示:
def cart(n, seq):
import itertools
b = 8
write = file.write # speed up lookup of method
while b < n:
n = n - 1
for p in itertools.product(seq, repeat=n):
write(''.join(p)+'\n') # only call it once in loop
这证明了使用分析器可能是了解将时间花在哪里并获得最大收益的最佳方式。
更新:
这是一个版本,它在进行单个file.write()
调用之前将所有生成的输出存储在内存中。它比使用快得多,StringIO.StringIO
因为它不太通用,但仍然不如使用cStringIO.StringIO
实例快。
file = open('cart_output.txt', 'wt')
def cart(n, seq):
from itertools import product
buflist = []
append = buflist.append
b = 8
while b < n:
n = n - 1
for p in product(seq, repeat=n):
append(''.join(p))
file.write('\n'.join(buflist)+'\n')
file.close()