Python 大量迭代失败

2024-02-15

我写的简单蒙特卡罗 π 计算 http://math.fullerton.edu/mathews/n2003/montecarlopimod.htmlPython 程序,使用多处理模块。 它工作得很好,但是当我为每个工作人员传递 1E+10 次迭代时,会出现一些问题,并且结果是错误的。我不明白问题出在哪里,因为在 1E+9 迭代中一切都很好!

import sys
from multiprocessing import Pool
from random import random


def calculate_pi(iters):
    """ Worker function """

    points = 0  # points inside circle

    for i in iters:
        x = random()
        y = random()

        if x ** 2 + y ** 2 <= 1:
            points += 1

    return points


if __name__ == "__main__":

    if len(sys.argv) != 3:
        print "Usage: python pi.py workers_number iterations_per_worker"
        exit()

    procs = int(sys.argv[1])
    iters = float(sys.argv[2])  # 1E+8 is cool

    p = Pool(processes=procs)

    total = iters * procs
    total_in = 0

    for points in p.map(calculate_pi, [xrange(int(iters))] * procs):
        total_in += points

    print "Total: ", total, "In: ", total_in
    print "Pi: ", 4.0 * total_in / total

问题似乎是多处理对其可以传递给 xrange 内的子进程的最大 int 有限制。这是一个快速测试:

import sys
from multiprocessing import Pool
def doit(n):
  print n
if __name__ == "__main__":
  procs = int(sys.argv[1])
  iters = int(float(sys.argv[2]))
  p = Pool(processes=procs)
  for points in p.map(doit, [xrange(int(iters))] * procs):
    pass

Now:

$ ./multitest.py 2 1E8
xrange(100000000)
xrange(100000000)
$ ./multitest.py 2 1E9
xrange(1000000000)
xrange(1000000000)
$ ./multitest.py 2 1E10
xrange(1410065408)
xrange(1410065408)

这是多处理更普遍问题的一部分:它依赖于标准的 Python pickling,以及一些次要的(且没有详细记录的)扩展来传递值。每当出现问题时,首先要检查的是这些值是否按照您的预期方式到达。

其实你玩一下就可以看出这个问题pickle,甚至无需触摸multiprocessing(由于这些较小的扩展,情况并非总是如此,但通常是这样):

>>> pickle.dumps(xrange(int(1E9)))
'c__builtin__\nxrange\np0\n(I0\nI1000000000\nI1\ntp1\nRp2\n.'
>>> pickle.dumps(xrange(int(1E10)))
'c__builtin__\nxrange\np0\n(I0\nI1410065408\nI1\ntp1\nRp2\n.'

即使不了解 pickle 协议的所有细节,也应该很明显I1000000000第一种情况是 1E9 作为 int,而下一种情况的等效块大约是 1.41E9,而不是 1E10,作为 int。你可以尝试一下

一个明显的尝试解决方案是通过int(iters)代替xrange(int(iters)), 然后让calculate_pi创建xrange从它的论证来看。 (注意:在某些情况下,像这样的明显转换可能会损害性能,甚至可能会严重损害性能。但在这种情况下,它可能会稍微好一点——传递一个更简单的对象,并且您正在并行化xrange结构——当然,差异很小,可能并不重要。只是在盲目转型之前一定要三思而行。)

快速测试表明这现在有效:

import sys
from multiprocessing import Pool

def doit(n):
  print xrange(n)

if __name__ == "__main__":
    procs = int(sys.argv[1])
    iters = int(float(sys.argv[2]))
    p = Pool(processes=procs)
    for points in p.map(doit, [iters] * procs):
      pass

Then:

$ ./multitest.py 2 1E10
xrange(10000000000)
xrange(10000000000)

但是,您仍然会遇到更大的限制:

$ ./multitest.py 2 1E100
OverflowError: Python int too large to convert to C long

这又是同样的基本问题。解决这个问题的一种方法是将 arg 作为字符串一直向下传递,并在子进程内执行 int(float(a)) 。

附注:我这样做的原因iters = int(float(sys.argv[2]))而不仅仅是iters = float(sys.argv[2])然后使用int(iters)稍后是为了避免意外使用浮动iters稍后的值(正如OP的版本所做的那样,在计算中total因此total_in / total).

请记住,如果数字足够大,就会遇到 C double 类型的限制:1E23通常为 99999999999999991611392,而不是 100000000000000000000000。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 大量迭代失败 的相关文章

  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • 如何修复 Subversion «!»地位

    Subversion 手册指出 物品丢失 例如您搬家或 没有使用 svn 就删除了它 这 也表明一个目录是 不完整 结账或更新 被打断 但正如 Subversion 经常出现的情况一样 没有说明如何解决该问题 通常 我会使用我信任的Fix
  • 是否有 OAuth2 与 WebFlux 的工作示例

    我正在尝试将 OAuth2 添加到 WebFlux 但找不到任何工作示例 为了实现自己的授权服务器 我使用这样的代码 EnableAuthorizationServer Configuration public class ServerAu
  • Facebook SDK:FBLoginView 重新授权发布流

    使用 FBLoginView 时调用 initWithReadPermission 后 我遇到重新授权发布流的问题 我尝试在委托函数内部调用 我可以在其中获取用户信息 在下一个对话框请求发布流权限后 应用程序向我抛出一个异常 com fac
  • SharePoint 初学者用户教程有什么好处? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 好吧 我的任务是为一个政府内部网站创建一个 wss v3 0 网站 但内部 SharePoint 经验很少 尽管这是一个 IT 部门 所以
  • 如何提取一些单元测试来分离gradle测试任务?

    假设我想将 Robolectric 测试与普通单元测试分开 并将它们作为单独的 gradle 任务运行 是否可以 我已经设法从单元测试中排除不需要的测试 android testOptions unitTests all exclude p
  • Linux内核AIO,开放系统调用

    为什么 Linux 内核 AIO 不支持异步 开放 系统调用 因为 打开 可能会长时间阻塞文件系统 不是吗 首先 这是一个非常好的 合理的问题 不幸的是 它可能会赶走比我更有知识的人 AFAICT 没有good原因 您设法挖掘的讨论是相关的
  • Rails 路由:我缺少什么?

    我的应用程序有票证 票证可以 解决 我可以通过 AJAX POST 到 resolve 操作 没有任何问题 但我无法通过普通的 HTML 表单 POST 我明白了No route matches tickets 321 resolve HT
  • 抽象泛型类采用本身派生自该类的类型参数

    您认为创建一个将派生自自身的类作为类型参数的抽象泛型类是可接受的还是不好的做法 这允许抽象泛型类操作派生类的实例 特别是根据需要创建派生类的 new 实例的能力 并且可以帮助避免在派生自它的具体类中重复代码 如果 不好 您更喜欢什么替代方案
  • 谷歌地图 API v3:在点击折线事件上的两个现有点之间的折线上添加点

    如何在单击折线事件上的两个现有点之间的折线上添加点 谢谢你 如果你只是在谈论一个Polyline只有 2 个点 您可以使用 a 的中心LatLngBounds http code google com apis maps documenta
  • C++ 构造函数中可移动类型的右值

    我正在使用 C 11 并尝试构造一个拥有可移动类型的类 如下所示 class foo std istream input public foo std istream in input in 然后实例化该对象 foo var1 std if
  • Java For-Each循环:排序顺序[重复]

    这个问题在这里已经有答案了 java for each 循环是否保证在列表上调用时元素将按顺序呈现 在我的测试中似乎确实如此 但我似乎找不到任何文档中明确提到的这一点 List
  • 为什么 NetBeans 找不到我的某些项目的 CopyLib?

    今天早上我遇到了一个棘手的问题 我花了几个小时试图追踪它 我继承了两个 NetBeans 项目的一些代码 A and B 他们都成功构建并运行 没有复杂的 Ant 构建任务 只是默认的 IDE 设置 这两个项目共享大量代码 因此我将其分解为
  • 如何从 Rails 模型中删除列?

    我需要从我已经创建的 Rails 模型中删除几列 并且该模型中有一些行条目 怎么做 任何包含修改 Rails 中架构的详细信息的链接吗 我正在使用 Rails 版本 3 要删除数据库列 您必须生成迁移 script rails g migr
  • Jquery:连接两个元素的值

    尝试在 Jquery 中实现一些目标有点卡住了 想知道是否有人可以提供帮助 我正在创建自己的就地编辑功能 您可以在其中单击编辑按钮 然后我的定义列表的内容将被交换为表单 预填充数据 如同this http 15daysofjquery co
  • 函数和 powershell 远程处理

    我有一个运行良好的脚本 但我想提高我的 powershell 知识 并想知道是否有更简单的方法来做到这一点 我的脚本的一部分连接到服务器并拉回服务器上的文件和大小列表并将其导出到 csv 我找到了一个函数 Exportcsv 它允许我使用早
  • 如何在 React js - JSX 中动态创建输入文本字段?

    我对 ReactJS 还很陌生 我遇到了一个场景 我必须创建 6 个彼此非常相似的输入字段 现在我的类渲染方法中有类似的东西 render return div p p div
  • 如何使“旧式”异步方法可等待

    如果我有一个带有回调的异步方法 MyMethodAsync
  • 如何从 jar 库创建 OSGi 包?

    如何从 jar 库创建 OSGi 包 如果您使用的是 eclipse 有一个向导 它允许您选择多个 jar 库并创建包含这些 jar 的插件项目 即 OSGi 包 你可以在这里找到它 File gt New gt Other gt Plug
  • 从 PL/SQL 调用/使用 JMS

    是否可以从 PL SQL 调用 使用 JAVA 消息服务 JMS 我知道我们可以从 pl SQL 调用 java 但是调用 java 与调用 JMS 队列或 JMS 主题不同 因为 JMS 依赖于 JNDI 资源命名 当我们使用基于 JND
  • Python 大量迭代失败

    我写的简单蒙特卡罗 计算 http math fullerton edu mathews n2003 montecarlopimod htmlPython 程序 使用多处理模块 它工作得很好 但是当我为每个工作人员传递 1E 10 次迭代时