Python,使用多处理比不使用慢

2023-11-22

在花了很多时间尝试了解多处理之后,我想出了这段代码,这是一个基准测试:

示例1:

from multiprocessing  import Process

class Alter(Process):
    def __init__(self, word):
        Process.__init__(self)
        self.word = word
        self.word2 = ''

    def run(self):
        # Alter string + test processing speed
        for i in range(80000):
            self.word2 = self.word2 + self.word

if __name__=='__main__':
    # Send a string to be altered
    thread1 = Alter('foo')
    thread2 = Alter('bar')
    thread1.start()
    thread2.start()

    # wait for both to finish

    thread1.join()
    thread2.join()

    print(thread1.word2)
    print(thread2.word2)

这将在 2 秒内完成(多线程时间的一半)。出于好奇,我决定接下来运行这个:

示例2:

word2 = 'foo'
word3 = 'bar'

word = 'foo'
for i in range(80000):
    word2 = word2 + word

word  = 'bar'
for i in range(80000):
    word3 = word3 + word

print(word2)
print(word3)

令我惊恐的是,这一切只用了不到半秒!

这里发生了什么?我期望多处理运行得更快 - 考虑到示例 1 是示例 2 分成两个进程,它不应该只用示例 2 一半的时间完成吗?

Update:

在考虑了克里斯的反馈之后,我添加了消耗最多处理时间的“实际”代码,并引导我考虑多重处理:

self.ListVar = [[13379+ strings],[13379+ strings],
                [13379+ strings],[13379+ strings]]

for b in range(len(self.ListVar)):
    self.list1 = []
    self.temp = []
    for n in range(len(self.ListVar[b])):
        if not self.ListVar[b][n] in self.temp:
            self.list1.insert(n, self.ListVar[b][n] + '(' + 
                              str(self.ListVar[b].count(self.ListVar[b][n])) +
                              ')')
           self.temp.insert(0, self.ListVar[b][n])

   self.ListVar[b] = list(self.list1)

多重处理可能对您正在做的事情有用,但不适用于您考虑使用它的方式。由于您基本上是对列表中的每个成员进行一些计算,因此您可以使用multiprocessing.Pool.map方法,对列表成员进行并行计算。

这是一个示例,显示了使用单个进程并使用的代码的性能multiprocessing.Pool.map:

from multiprocessing import Pool
from random import choice
from string import printable
from time import time

def build_test_list():
    # Builds a test list consisting of 5 sublists of 10000 strings each.
    # each string is 20 characters long
    testlist = [[], [], [], [], []]
    for sublist in testlist:
        for _ in xrange(10000):
            sublist.append(''.join(choice(printable) for _ in xrange(20)))
    return testlist

def process_list(l):
    # the time-consuming code
    result = []
    tmp = []
    for n in range(len(l)):
        if l[n] not in tmp:
            result.insert(n, l[n]+' ('+str(l.count(l[n]))+')')
            tmp.insert(0, l[n])
    return result

def single(l):
    # process the test list elements using a single process
    results = []
    for sublist in l:
        results.append(process_list(sublist))
    return results

def multi(l):
    # process the test list elements in parallel
    pool = Pool()
    results = pool.map(process_list, l)
    return results

print "Building the test list..."
testlist = build_test_list()

print "Processing the test list using a single process..."
starttime = time()
singleresults = single(testlist)
singletime = time() - starttime

print "Processing the test list using multiple processes..."
starttime = time()
multiresults = multi(testlist)
multitime = time() - starttime

# make sure they both return the same thing
assert singleresults == multiresults

print "Single process: {0:.2f}sec".format(singletime)
print "Multiple processes: {0:.2f}sec".format(multitime)

Output:

Building the test list...
Processing the test list using a single process...
Processing the test list using multiple processes...
Single process: 34.73sec
Multiple processes: 24.97sec
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python,使用多处理比不使用慢 的相关文章

  • System.Threading._IOCompletionCallback.PerformIOCompletionCallback(...) 处的 System.AccessViolationException

    使用 Net Framework 4 我在多线程 C 代码中遇到 System AccessViolationException 即使我的所有代码都是托管代码 这可能是 Net 中的一个错误吗 因为我一直认为使用 Net 意味着无论我犯什么
  • 如何使用 Twython 将 oauth_callback 值传递给 oauth/request_token

    Twitter 最近刚刚强制执行以下规定 1 您必须通过oauth callbackoauth request token 的值 这不是可选的 即使您已经在 dev twitter com 上设置了一个 如果您正在执行带外 OAuth 请通
  • 类型错误:translate() 只接受一个参数(给定 2 个参数)[重复]

    这个问题在这里已经有答案了 我的代码在 python 2 x 版本上运行良好 但是当我尝试在 python 3 x 版本上运行它时 出现错误 主题 需要缩写短信编码中的任何消息 Code def sms encoding data star
  • 在Python中清理属于不同语言的文本

    我有一个文本集合 其中的句子要么完全是英语 印地语或马拉地语 每个句子附加的 id 为 0 1 2 分别代表文本的语言 无论任何语言的文本都可能有 HTML 标签 标点符号等 我可以使用下面的代码清理英语句子 import HTMLPars
  • Python ElementTree 获取带有命名空间的属性

    我试图访问 XML 中的 def 所以在这个例子中我会得到Evolus Common PlainTextV2作为输出 我似乎无法弄清楚如何获取具有名称空间的属性 如果我想得到id它工作得很好 Python for content ns in
  • Python:绘制甘特图的模块

    有没有一个好的Python绘图模块甘特图 http en wikipedia org wiki Gantt chart 我试过了开罗情节 http linil wordpress com 2008 09 16 cairoplot 11 但它
  • Erlang 进程如何(如果有的话)映射到内核线程?

    Erlang 因能够支持许多轻量级进程而闻名 它之所以能做到这一点 是因为它们不是传统意义上的进程 甚至不是 P 线程中的线程 而是完全在用户空间中的线程 这很好 实际上很棒 那么 Erlang 线程如何在多核 多处理器环境中并行执行呢 当
  • Django - 使 ModelForm(ImageField 的)仅接受某些类型的图像

    我将 Pillow 2 3 0 与 Django 一起使用 并且在 models py 中有一个 ImageField 如下所示 class UserImages models Model user models ForeignKey Us
  • 在 Python 中将嵌套字典位置作为参数传递

    如果我有一个嵌套字典 我可以通过索引来获取键 如下所示 gt gt gt d a b c gt gt gt d a b c 我可以将该索引作为函数参数传递吗 def get nested value d path a b return d
  • Pandas 中的数据透视表小计

    我有以下数据 Employee Account Currency Amount Location Test 2 Basic USD 3000 Airport Test 2 Net USD 2000 Airport Test 1 Basic
  • 在 matplotlib 中将 3D 背景更改为黑色

    我在将 3D 图表的背景更改为黑色时遇到问题 这是我当前的代码 当我将facecolor设置为黑色时 它会将图表内部更改为灰色 这不是我想要的 fig plt figure fig set size inches 10 10 ax plt
  • 获取 python 模块的 2 个独立实例

    我正在与以非 OO 方式编写的 python 2 x API 进行交互 它使用模块全局范围来处理一些内部状态驱动的东西 在它不再是单例的情况下需要它 并且修改原始代码 不是我们的 不是一个选择 如果不使用单独解释器的子进程运行 有什么方法可
  • python:xml.etree.ElementTree,删除“命名空间”

    我喜欢 ElementTree 解析 xml 的方式 特别是 Xpath 功能 我有一个带有嵌套标签的应用程序的 xml 输出 我想按名称访问此标签而不指定名称空间 这可能吗 例如 root findall molpro job 代替 ro
  • Matplotlib:检查空图

    我有一个循环加载并绘制一些数据 如下所示 import os import numpy as np import matplotlib pyplot as plt for filename in filenames plt figure i
  • 访问影子 DOM 中的元素

    是否有可能查找 Shadow DOM 中的元素与蟒蛇硒 示例用例 我有这个input with type date
  • 在多线程环境中捕获信号

    我有一个大型程序 需要尽可能具有弹性 并且有大量线程 我需要捕获所有信号SIGBUS SIGSEGV 并在必要时重新初始化有问题的线程 或者禁用该线程以继续减少功能 我的第一个想法是做一个setjump 然后设置信号处理程序 可以记录问题
  • 具有行业级约束的 SciPy 投资组合优化

    尝试在这里优化投资组合权重分配 通过限制风险来最大化我的回报函数 我可以毫无问题地通过简单的约束 所有权重之和等于 1 找到产生我的回报函数的优化权重 并做出另一个约束 即我的总风险低于目标风险 我的问题是 如何为每个组添加行业权重界限 我
  • scikit-learn kmeans 聚类的初始质心

    如果我已经有一个可以作为初始质心的 numpy 数组 我该如何正确初始化 kmeans 算法 我正在使用 scikit learn Kmeans 类 这个帖子 具有选定初始中心的 k 均值 https stackoverflow com q
  • 如何从 python 中的字符串中删除 ANSI 转义序列

    这是包含我的字符串的片段 ls r n x1b 00m x1b 01 31mexamplefile zip x1b 00m r n x1b 01 31m 该字符串是从我执行的 SSH 命令返回的 我无法使用当前状态下的字符串 因为它包含 A
  • 使用 python/scipy 进行 voronoi 和 lloyd 松弛

    如何使用 Qhull 确定哪些 voronoi 单元 按索引 是 正确的 由 现有顶点 组成 我正在尝试使用 LLoyds 算法和 scipy spatial Voronoi 它是 Qhull 的包装器 生成的输入来执行约束松弛 就代码而言

随机推荐

  • Spark List 中的 itemChangeEffect 等效项是什么?

    在 Flex 3 中 使用 List 组件 您可以向 itemChangeEffect 属性添加效果 从而允许您以动画方式添加 删除列表控件中的项目 Spark 列表中的等效项似乎是 rendererAdd 和 Removed 事件 但这不
  • 16:9 宽高比,固定宽度

    例如 如果我要嵌入 YouTube 视频 使用 jQuery 我会设置纵横比为 16 9 的高度 因此如果宽度为 560 则高度应为 315px 我有这个 jquery 来设置高度 但我不知道如何应用 16 9 比例 player pare
  • Python - 从可执行文件运行时,Multiprocessing.processes 成为主进程的副本[重复]

    这个问题在这里已经有答案了 我刚刚在我的程序中发现了一个与 Python 多处理模块的使用相关的奇怪错误 当我在我的机器上从源代码运行程序时 一切正常 但我一直使用 pyinstaller 将其构建为可执行文件 并且由于某种原因 当我运行从
  • JAXB:所有元素都需要命名空间前缀

    我正在使用 Spring WebServiceTemplate 进行 Web 服务调用 该调用使用 JAXB 生成请求 XML 我的要求需要 SOAP 请求中的所有元素 包括根 都具有名称空间前缀 只有一个名称空间 Ex
  • 以编程方式从 Google Play 商店下载 APK

    我正在创建一个 Android 应用程序 它依赖于其他一些 Android 应用程序 因此 如果这些依赖的应用程序尚未存在于用户的移动设备上 我想以编程方式从游戏商店下载它们 但在此过程中 我不希望控件转到 Play 商店应用程序 即不应显
  • iOS 8:UIAlertView / UIAlertController 不显示文本或按钮

    我有一个 UIAlertView 它在 iOS 7 中完美显示 但在 iOS 8 中 它不显示任何按钮或标签 警报仍然可见 但只是一个小白框 确定 和 取消 按钮也会接收其事件 但看不到任何文本 我已使用此警报在单击按钮时显示 IBActi
  • 重用 WCF 代理当前程序集中的类型

    VS WCF 集成有一个很好的选项 在引用的程序集中重用类型 问题是我需要相同的东西 但对于当前的程序集 有些类型已在我的程序集中定义 我需要重用它们 使用场景 我有组装 这里有 TypeA 我向其中添加了服务引用 其中一种方法返回与 Ty
  • display.getRealMetrics() 已弃用

    我正在使用 getRealMetrics 方法并发现它已被弃用 val display this display display getRealMetrics outMetrics 任何人都知道替代方案是什么 据官方称docs推荐的方法是使
  • 在 sphinx4 5prealpha 中运行对话框演示时无法访问麦克风

    我正在尝试运行 sphinx 4 pre alpha 的对话框演示 但它给出了错误 我正在创建一个实时语音应用程序 我使用 Maven 导入了项目 并遵循了有关堆栈溢出的指南 https stackoverflow com a 259630
  • 搜索 csv 文件最快的方法是什么?

    任务 检查文件中序列号和护照号码的可用性 我的决定如下 def check passport filename series str number str gt dict Find passport number and series pa
  • Sublime 2 - 根据文件类型更改背景颜色?

    使用现有的 Sublime 2 配色方案 有没有办法有选择地调整背景颜色 例如 仅限 js 文件 非常感谢 你必须修改你的 tmTheme配色方案plist 你可以通过菜单找到它Preferences Browse Packages Col
  • 如何获取 Windows 会话列表?

    我正在尝试找到一种方法来获取 Windows 会话列表 我需要与 用户 选项卡上的 任务管理器 中显示的信息相同的信息 我需要知道用户是否处于活动状态以及她 他是否已登录远程桌面会话 知道如何使用 C Windows XP Pro 做到这一
  • 如何旋转二维数组?

    灵感来自雷蒙德 陈的帖子 假设您有一个 4x4 二维数组 请编写一个将其旋转 90 度的函数 雷蒙德链接到伪代码中的解决方案 但我想看看一些现实世界的东西 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 Becomes 3
  • 在 python 中使用 AWS Lambda 将 Post 请求发送到外部 API

    我想向外部 API 发送发布请求 https example com api jobs test 每隔一小时 我使用的Lambda函数如下 Handler index lambda handler python 3 6 index py i
  • 找不到变量:导航

    我正在尝试在两个屏幕之间导航react navigation 我能够访问navigate在 的里面render方法 因为它的范围也在该方法内部 我应该在哪里声明 以便我可以通过此方法访问它component 我正在尝试访问navigate在
  • 如何将基于 SWF 的自定义音频播放器嵌入到 Facebook 墙帖中?

    我们有一个基于 SWF 的音频播放器 我们希望能够将此播放器嵌入到 Facebook 帖子墙中 就像将 Youtube 视频或 BandPage 歌曲嵌入到 Facebook 动态墙中一样 现在 单击我们提供的图像会重定向到播放器 而不是内
  • OAuth 2 身份验证中 grant_type 参数的用途是什么

    我在 Lumen 微框架中使用 OAuth 2 身份验证 现在我正在使用grant type值为password 它抛出unsupported grant type 如果我使用不同的东西 我想知道使用的目的grant type is pas
  • Python反向跨步切片

    我的问题的一个具体例子是 在这个例子中我怎样才能得到 3210 gt gt gt foo 0123456 gt gt gt foo 0 4 0123 gt gt gt foo 1 6543210 gt gt gt foo 4 0 1 I w
  • 如果我 Thread.Sleep() 真的很忙吗?

    我的问题对定义有点挑剔 下面的代码可以用 忙等待 来形容吗 尽管它使用 Thread Sleep 来允许上下文切换 while true if work is ready doWork Thread Sleep A FEW MILLISEC
  • Python,使用多处理比不使用慢

    在花了很多时间尝试了解多处理之后 我想出了这段代码 这是一个基准测试 示例1 from multiprocessing import Process class Alter Process def init self word Proces