gpt4 book ai didi

python itertools 产品慢是输出文件的写入速度的瓶颈

转载 作者:行者123 更新时间:2023-12-01 05:51:41 29 4
gpt4 key购买 nike

我有一个简单的 python 函数来执行 itertools 乘积函数。如下所示。

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')

该功能可以工作,但速度非常慢。它甚至没有使用大量的资源。我想知道瓶颈是否是磁盘写入速度?目前该脚本的平均速度为每秒 2.5 mb。我还尝试在固态驱动器上进行此操作并获得相同的速度,这使我相信写入速度不是瓶颈。有没有办法加快这个功能并使用更多的系统资源?或者 itertools 只是慢?请原谅我是 python 新手。

最佳答案

您可以分析代码以了解瓶颈的位置。下面将创建一个名为“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

这证明拥有一个分析器可能是了解将时间花在哪里并获得最大 yield 的最佳方式。

更新:

这是一个在进行单个 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()

关于python itertools 产品慢是输出文件的写入速度的瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14015936/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com