首先,这是我第一次try 多线程或多处理(在教程之外).我正在try 通过使用多线程或多处理来加速我的类中的一些初始化,还不确定哪个更有意义.我的代码是这样的

import threading

classlist = []

filelist = ['a','b','c'] #it's a list of string paths

def loadClasses(filelist):
    global classlist, filelist
    classlist = [OtherClass(i) for i in filelist]

def threadingfunc(filelist):
    t1.threading.Thread(target=loadClasses)

threadingfunc()
        

与我只运行loadClass函数时相比,这似乎花费了两倍的时间. OtherClass大约需要1.5秒才能运行,但当我有大约40个文件要加载时,它会累积起来.

我试图用多处理器做同样的事情,但它似乎根本不起作用. 至于多处理,我还没有任何运气使任何工作. 这和我用过的差不多.

from multiprocessing import Pool

classlist = []
def loadClass(file):
    classlist.append(OtherClass(file))

def pool_handler():
    p = Pool(2)
    for file in filelist:
        p.map(loadClass, file)

这花费了大约相同的时间.所以我不知道接下来该往哪里走. 长话短说,我有一个要加载到我的OtherClass中的文件列表,我正在寻找加快速度的方法. 我很感谢任何人的帮助,请对Nooby好一点!

我已经使用多线程和多处理try 了上面的代码块.我能够让他们工作,但我没有看到完成速度的改善.有些方法实际上更长.

推荐答案

python threads

在C++中使用线程可以让您烧录所有内核,并且完成得更快.

在python中使用线程通常只是一个有趣的问题. 用于I/O受限进程,如Web服务器. 每个线程必须获取 GIL个 在完成任何工作之前,因此应用python线程 对于一项受计算机限制的工作通常不会取胜.


lint

def loadClass(file):

Pep-8个 客气地问你:请拼成load_class.

这一点尤其突出,因为函数 所考虑的显然不是一个阶级. 没有必要挑起LoadClass人的双重困惑.


cores

    p = Pool(2)

如果你是在一台有两个核心的奔腾电脑上,那就是possible. 但更有可能的是,您有五个以上的可用内核. 您可以指定一个更大的数字,但您可能更喜欢 将其默认为在运行时检测到的核心数量.

overhead: serializing

    for file in filelist:

您提到每个"加载"操作大约需要1500毫秒. 这似乎是一个很好的阻抗匹配这条线. 我只想提一下,如果每一次行动都是在 仅仅是一秒钟的一小部分,那么你可能会认为 在一个元组中排列了file个条目, 并将其发送到管道连接处 每个子进程都是一个batch.

overhead: deserializing

        p.map(load_class, file)

我不知道您的Load类函数附加到父级中的中央瓶颈全局list上的对象有多大. 根据细节,一个父进程可能会花费 对子级发送的结果值进行反序列化的大量CPU周期.

通常,一个好的策略是做几秒钟 计算时,在文件系统中存储大型JSON结果, 并返回结果文件的NonePath. 这样,父进程就不需要烧毁周期 反序列化一些巨大的JSON结果.

result order

看起来你不在乎发生when件事 只要他们do最终发生,所以你可能会感兴趣 在pool.map()个变种中,包括 imap_unordered().

这里的细节是,工作可能需要不同的时间. 放宽对结果交付顺序的限制 允许多处理库更积极地调度作业(job), 让更多的核心在大部分时间内忙碌,即使在现场 掉队的人.

stragglers

如果您知道多处理库不知道的事情, 您应该公开这样的知识,以便它可以调度任务 更理智地说.

例如,情况可能是"长文件" 暗示"加载文件的时间很长". 如果你把这些知识带到谈判桌上, 然后让调度程序知道这一点.给出了一个 Path个 索要ITS st_size是很容易的. 使用sorted key参数可以 按大小递减排序您的40个文件. 然后我们先装上大的, 而空闲的内核几乎看不到 最后是掉队的任务.

Python相关问答推荐

替换为Pandas

如何在WTForm中使用back_plumates参考brand_id?

使用Python从HTTP打印值

回归回溯-2D数组中的单词搜索

我可以使用极点优化这个面向cpu的pandas代码吗?

将从Python接收的原始字节图像数据转换为C++ Qt QIcon以显示在QStandardProject中

Python中MongoDB的BSON时间戳

如何自动抓取以下CSV

Pandas 在最近的日期合并,考虑到破产

如何将ctyles.POINTER(ctyles.c_float)转换为int?

当多个值具有相同模式时返回空

如何让剧作家等待Python中出现特定cookie(然后返回它)?

_repr_html_实现自定义__getattr_时未显示

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

如何过滤包含2个指定子字符串的收件箱列名?

在ubuntu上安装dlib时出错

无法连接到Keycloat服务器

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

Pandas GroupBy可以分成两个盒子吗?

在Python中计算连续天数