Python:以并行或多线程方式组合来自不同文件的列表

时间:2018-10-01 17:25:57

标签: python python-3.x multithreading parallel-processing

这是我的第一个问题。 几天前,我开始学习python,但遇到了问题。

我制作了一些python文件,每个文件都运行一个for循环并将结果附加到列表中。 因此,每个文件都有其自己的列表。

例如file1.py产生list1,file2.py产生list2等...

我的目标是将所有这些列表组合在一起,所以我要制作一个单独的“ main.py”文件并导入列表名称,然后像这样将它们组合在一起:

from file1 import list1
from file2 import list2
from file3 import list3

combined_lists = [*list1, *list2, *list3]

并且按预期工作正常。

但是问题是这种方法非常慢,因为它是按照我导入列表的顺序逐个导入列表。

例如,当我运行它时,它首先导入list1,当list1完成时,它先启动list2,然后再启动list3等。最后将它们组合在一起。

因此,因为我在400个不同的文件上有400个列表,所以这花费了很长时间。

有什么办法可以并行导入所有列表并将它们组合在一起?

喜欢使用多线程还是其他任何方法?

请注意,我不在乎组合列表中项目的顺序。

1 个答案:

答案 0 :(得分:0)

您可以生成多个读取器进程(最好是via a Pool),这些进程可以为Queue提供一个读取器,并由一个使用者对其进行读取。您也可以使用threading进行此操作;一些相关的示例代码can be found here

请注意,在这种情况下,使用者可能不应该将结果收集到一个列表中,而应该在每个元素从队列中出来时对其执行要执行的实际操作。

但是...

  

我制作了一些python文件,每个文件都运行一个for循环并将结果附加到列表中。因此,每个文件都有其自己的列表。

为什么?听起来这比应该的要复杂得多,但是在不知道您实际要完成的工作的情况下,无法肯定地说。

如果没有更多的信息,如果您要处理的数据量很大,听起来您的脚本应该正在生成CSV文件(或者应该将它们组合为一个可以生成单个CSV文件的脚本)。甚至使用RDBMS可能比每次导入时重新生成这些数据集更好,除非它们经常更改。