您可以根据文件的数量和大小来加速程序。请参见类似问题的答案:
Efficient file reading in python with need to split on '\n'。您可以使用多线程、多进程或其他方式(例如迭代器)并行读取多个文件,从而可能获得一些加速。最简单的方法是使用像
pathos
这样的库(是的,我是作者),它在一个通用API中提供了多进程、多线程和其他选项,因此您只需编写一次代码,然后在不同的后端之间切换,直到找到最适合您情况的最快速度。有许多不同类型的映射选项(在
pool
对象上),您可以在此处查看:
Python multiprocessing - tracking the process of pool.map operation。虽然以下示例不是最具想象力的示例,但它显示了双重嵌套映射(相当于双重嵌套循环)以及如何轻松更改其后端和其他选项。
>>> import pathos
>>> p = pathos.pools.ProcessPool()
>>> t = pathos.pools.ThreadPool()
>>> s = pathos.pools.SerialPool()
>>>
>>> f = lambda x,y: x+y
>>> # two blocking maps, threads and processes
>>> t.map(p.map, [f]*5, [range(i,i+5) for i in range(5)], [range(i,i+5) for i in range(5)])
[[0, 2, 4, 6, 8], [2, 4, 6, 8, 10], [4, 6, 8, 10, 12], [6, 8, 10, 12, 14], [8, 10, 12, 14, 16]]
>>> # two blocking maps, threads and serial (i.e. python's map)
>>> t.map(s.map, [f]*5, [range(i,i+5) for i in range(5)], [range(i,i+5) for i in range(5)])
[[0, 2, 4, 6, 8], [2, 4, 6, 8, 10], [4, 6, 8, 10, 12], [6, 8, 10, 12, 14], [8, 10, 12, 14, 16]]
>>> # an unordered iterative and a blocking map, threads and serial
>>> t.uimap(s.map, [f]*5, [range(i,i+5) for i in range(5)], [range(i,i+5) for i in range(5)])
<multiprocess.pool.IMapUnorderedIterator object at 0x103dcaf50>
>>> list(_)
[[0, 2, 4, 6, 8], [2, 4, 6, 8, 10], [4, 6, 8, 10, 12], [6, 8, 10, 12, 14], [8, 10, 12, 14, 16]]
>>>
我发现通常情况下,无序迭代映射(uimap
)是最快的,但你必须不关心处理的顺序,因为返回时可能会出现乱序。就速度而言…在上述操作周围加上类似于 time.time
的调用即可。
获取 pathos
请访问:https://github.com/uqfoundation