我一般很新的蟒蛇和编程,但我想运行在包含与蟒蛇约7万行制表符分隔的.txt文件“滑动窗口”的计算。 我的意思滑动窗口是,它会运行一个计算过说50,000行,报告的数量,然后向上移动说10000行,并在另一个50,000行执行相同的计算。 我的计算和“滑动窗口”正常工作,它如果我测试它在我的数据的AA小部分运行良好。 但是,如果我尝试在我的整个数据运行的程序设置是非常慢(我已经受够了,现在运行约40小时)。 数学是很简单,所以我不认为它应该是长期服用该做的。
现在我看我的.txt文件的方法是使用csv.DictReader模块。 我的代码如下:
file1='/Users/Shared/SmallSetbee.txt'
newfile=open(file1, 'rb')
reader=csv.DictReader((line.replace('\0','') for line in newfile), delimiter="\t")
我认为,这是制作出来的字典全部7个万行的一次,我在想可能是它会减慢这么多的大文件的原因。
因为我只在“块”或一次数据的“窗口”运行我的计算有兴趣,有没有读一次只指定线路,进行计算,然后用指定了新的重复“更有效的方法块”或‘指定行之窗’?
一个collections.deque
是可以拍摄最大尺寸的物品的有序集合。 当您添加一个项目一端,此起彼伏的另一端。 这意味着,要遍历您的CSV一个“窗口”,你只需要不断添加行到deque
,它会处理已经扔掉完整的。
dq = collections.deque(maxlen=50000)
with open(...) as csv_file:
reader = csv.DictReader((line.replace("\0", "") for line in csv_file), delimiter="\t")
# initial fill
for _ in range(50000):
dq.append(reader.next())
# repeated compute
try:
while 1:
compute(dq)
for _ in range(10000):
dq.append(reader.next())
except StopIteration:
compute(dq)
不要使用csv.DictReader
,改用csv.reader
。 它需要更长的时间来创建一个字典的每一行比需要为每个行的清单。 此外,它是稍快通过索引来访问列表比它通过一键访问字典。
我计时遍历所有使用两个CSV读者30万行4列的csv文件。 csv.DictReader
比花长7倍 csv.reader
。
与此相结合katrielalex的建议使用collections.deque
,你会看到一个不错的加速比。
此外, 配置文件代码以查明你在哪里花你的大部分时间。