Python例程在使用多处理时运行速度要慢得多

2024-04-27 17:16:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python应用程序的子例程,它获取一个包含8个字符序列号的列表,并在一组目录中搜索包含这些sn的文件名,这些sn具有一系列可能的扩展名。执行此操作的函数如下所示。在

def CompleteSN(SNorig, directories, exts, directoryContents=None):

    # Split SNorig into its directory path and basename
    directory, basename = os.path.split(SNorig)

    #Don't try to complete if it has a directory already
    if len(directory) > 0:
        return SNorig

    # Split the basename into extension (ext) and serial number (SN)
    SN = basename[:8].upper()

    #If we have a cache, check it
    if directoryContents is not None:
        if SN in directoryContents:
            return directoryContents[SN]
        else:
            return None

    possSNs = ['.'.join((SN, ext)) for ext in exts]

    for pSN in possSNs:
        for d in directories:
            dpath = os.path.join(d, pSN)
            if os.path.exists(dpath):
                return dpath

    return None

SN是要转换成完整路径的序列号,directories是要查找它的目录列表,exts是要尝试的可能扩展的列表(没有前导点),而directoryContents要么是None,要么是一个大dict(几十万个条目),dict将目录中要搜索的文件序列号映射到它们的全名。我的想法是,要完成一大组序列号,把所有能找到的序列号都放到字典里,这样就可以快速查找它们,而不是对每个序列号进行系统调用。为了完成大量的社交网络,这将是值得的成本,使dict

而且,正如我所预测的那样,一旦目录内容被填充,速度会快得多。但是,只有在不使用多处理时才会出现这种情况。我允许用户切换多处理模式,当directoryContents为None时,这比预期的更快。(例如,当我们通过检查文件的存在性来查找文件时os.path.exists)但是,当检查dict时,在多处理.池速度非常慢,只有不到10个SNs/秒。(与不使用多处理时的数千个相比)关于发生了什么,我最好的猜测是,无论Python使用什么机制在池工作器(我认为有8个)之间共享数据,都陷入了如此庞大的dict结构的泥潭。有人能帮我了解一下这里发生了什么事吗?在


Tags: pathin目录none列表returnifos