【发布时间】:2013-08-07 13:19:01
【问题描述】:
我有一个大文件,我需要从中读取并制作字典。我希望这尽可能快。但是我在 python 中的代码太慢了。这是一个显示问题的最小示例。
先做一些假数据
paste <(seq 20000000) <(seq 2 20000001) > largefile.txt
现在这是一段最小的 Python 代码,用于读取它并制作字典。
import sys
from collections import defaultdict
fin = open(sys.argv[1])
dict = defaultdict(list)
for line in fin:
parts = line.split()
dict[parts[0]].append(parts[1])
时间安排:
time ./read.py largefile.txt
real 0m55.746s
但是可以更快地读取整个文件:
time cut -f1 largefile.txt > /dev/null
real 0m1.702s
我的 CPU 有 8 个核心,是否可以将这个程序并行化 python来加快速度?
一种可能是读取输入的大块,然后在不同的非重叠子块上并行运行 8 个进程,从内存中的数据并行创建字典,然后读取另一个大块。这在 python 中是否可能以某种方式使用多处理?
更新。假数据不是很好,因为每个键只有一个值。更好的是
perl -E 'say int rand 1e7, $", int rand 1e4 for 1 .. 1e7' > largefile.txt
【问题讨论】:
-
这个列表可能会拖慢你的速度。
-
@sihrc 根据分析,大部分时间都花在 dict[parts[0]].append(parts[1]) 中,但 append 确实需要大约 10% 的时间。请注意,在这个假案例中,列表的长度只有 1,但总的来说我希望它们更长。
-
这就是我的意思。那 .append 部分正在减慢您的速度。您是否想过附加大型列表的替代方法?您要附加什么样的数据?
-
您不能仅使用一个磁盘并行化 I/O。如果您有很多 RAM,您可以使用
readlines()将整个文件读入内存并直接在 RAM 中处理它们。 -
是的,但是读取文件并不是慢的部分。就是字典中的追加列表,可以并行化
标签: python performance multiprocessing