在 python 中并行化这个嵌套 for 循环

2024-03-20

我再次努力提高这段代码的执行时间。由于计算确实非常耗时,我认为最好的解决方案是并行化代码。

我首先使用地图,如中所述this https://stackoverflow.com/questions/29217088/parallelize-a-nested-for-loop-in-python-for-finding-the-max-value问题,但后来我尝试了一种更简单的方法,认为我可以找到更好的解决方案。然而我还想不出任何办法,所以由于这是一个不同的问题,我决定将其作为一个新问题发布。

我正在 Windows 平台上工作,使用 Python 3.4。

这是代码:

similarity_matrix = [[0 for x in range(word_count)] for x in range(word_count)]
for i in range(0, word_count):
    for j in range(0, word_count):
        if i > j:
            similarity = calculate_similarity(t_matrix[i], t_matrix[j])
            similarity_matrix[i][j] = similarity
            similarity_matrix[j][i] = similarity

这是calculate_similarity功能:

def calculate_similarity(array_word1, array_word2):
      denominator = sum([array_word1[i] + array_word2[i] for i in range(word_count)])
      if denominator == 0:
          return 0
      numerator = sum([2 * min(array_word1[i], array_word2[i]) for i in range(word_count)])
      return numerator / denominator

以及代码的解释:

  • word_count是列表中存储的唯一单词的总数
  • t_matrix是一个包含每对单词的值的矩阵
  • 输出应该是similarity_matrix其维度为word_count x word_count还包含每对单词的相似度值
  • 将两个矩阵都保存在内存中就可以了
  • 经过这些计算后,我可以轻松找到每个单词最相似的单词(或前三个相似的单词,根据任务可能需要)
  • calculate_similarity采用两个浮点列表,每个列表代表一个单独的单词(每个列表都是 t_matrix 中的一行)

我使用 13k 个单词的列表,如果计算正确,系统上的执行时间将是几天。所以,任何能在一天内完成工作的事情都会很棒!

也许只是并行化计算numerator and denominator in calculate_similarity将会取得显着的改进。


这是与中相同的通用算​​法的替代实现马特的回答 https://stackoverflow.com/a/29223859/1405065,只需使用multiprocessing.Pool代替concurrent.futures.ProcessPoolExecutor。它可能比他的代码更有效,因为输入的值 (t_matrix)仅序列化一次并传递给initializer每个工作进程中的函数。

import multiprocessing
import itertools

def worker_init(matrix):
    global worker_matrix
    worker_matrix = matrix

def worker(i, j):
    similarity = calculate_similarity(worker_matrix[i], worker_matrix[j])
    return i, j, similarity

def main(matrix):
    size = len(matrix)
    result = [[0]*size for _ in range(size)]
    with multiprocessing.Pool(initializer=worker_init, initargs=(matrix,)) as pool:
        for i, j, val in pool.starmap(worker, itertools.combinations(range(size), 2)):
            result[i][j] = result[j][i] = val
    return result

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

在 python 中并行化这个嵌套 for 循环 的相关文章

  • d3.js 强制布局是否允许动态 linkDistance?

    我使用力布局来表示有向未加权网络 我的灵感来自以下例子 http bl ocks org mbostock 1153292 http bl ocks org mbostock 1153292 我的问题是 在我的情况下 节点之间有更多的链接
  • 在 Chrome 扩展中使用页面的 Angular JS

    我有一个 HTML 页面 其中有一些使用 Angular 配置的 DOM 现在我正在构建一个 chrome 扩展来修改文本框中的值 element value newValue不起作用 因为文本框是用 Angular 设计的 在阅读了一些资
  • 在对话中获取“用户正在输入”信息的 telegram API 方法是什么?

    我正在尝试实现一个非常基本的 Telegram 客户端 我想知道如何获取告诉我其他用户正在打字的信息 我知道如何发送此信息 通过使用设置输入 https core telegram org method messages setTyping
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include
  • Prolog中计算数字是否为素数

    我正在尝试计算输入是否是素数 但出了问题 这是我的代码 primeNumber X prime prime A 1 prime prime A B R is A mod B R 1 R A prime prime X B B lt A Ne
  • 使用 mocha/chai 确保 REST API 提供文件?

    我想验证对 REST API 端点之一的调用是否正在提供文件 但我不确定如何进行操作 并且我没有看到任何相关示例 我确实看过文档 http chaijs com api bdd 但这对我没有多大帮助 服务器端代码本质上是 在 Express
  • eXist - 加载 XSLT 集合() - URIResolver 抛出异常

    环境 eXist db 4 2 1 XQuery 3 1 XSLT 2 0 在 eXist db 中 我正在加载一个 XSLT 文件 其中包含对 eXist 中集合的引用 以便使用密钥对在那里找到的文档执行搜索 此引用似乎引发了撒克逊人的错
  • 我如何才能获得 Jenkins 的工作范围凭证?

    首先抱歉 如果这个问题及其解决方案存在于某处 但我找不到它 我希望能够在工作中创建凭证 并且只能在该工作中使用 这是一种工作范围凭证 目前 凭证插件仅建议全局和系统范围 因此凭证可用于所有作业 凭据绑定插件似乎也没有解决我的问题 但公平地说
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use
  • gis计算点和多边形/边界之间的距离

    我想使用 python 计算一个点到一个国家边界之间的距离shapely 它应该工作得很好 point distance poly 例如在这里展示查找多边形形状上最近点的坐标 https stackoverflow com question
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm
  • 非 www .htaccess 重定向 - 忽略其他子域

    我有一个 非 www 的 htaccess 重定向 如下所示 RewriteEngine on RewriteCond HTTP HOST www RewriteRule http www HTTP HOST 1 R 301 L 这是工作
  • 将变量从调用它的父页面传递给 Vue 组件

    我有一个简单的表格 显示了我的所有数据 主文件 php table class table table bordered table hover thead tr th Job Name th th Job Description th t
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • JbdcTemplate - 带有动态 SQL 查询的PreparedStatements

    I know jdbcTemplate可以用来创建PreparedStatements如果你这样设置 i e private JdbcTemplate jdbcTemplate String sqlQuery Select from tab
  • html 表:thead 与 th

    它看起来像 根据示例这一页 http www w3 org TR html4 struct tables html无论如何 如果您使用THEAD 则不需要使用TH 真的吗 如果是这样 THEAD 与 TH 相比有何优点 缺点 The the
  • SendGrid事件通知认证

    我已经为 sendgrid 设置了一个端点来发送事件通知 但是 服务器设置了基本身份验证 并且事件不会通过 因为它们未经身份验证 如何通过 SendGrid 或将 SendGrid 列入白名单来验证这些事件 Webhook 设置 HTTP
  • 为什么 SSRS 报表从 SQL Server Reporting Services 运行时生成的数据与使用“预览”选项卡运行时生成的数据不同?

    我有一个运行我想要的数据的报表 从 预览 选项卡 即 或者在 VS 2010 中使用 F5 运行时 但是当我将报表 rdl 文件 上传到 SQL Server Reporting Services 并运行更新后的报表时从那里报告 它仍然显示
  • AWS CloudWatchLog 限制

    我正在尝试找到集中式解决方案来将我的应用程序日志记录从数据库 RDS 中移出 我本想使用 CloudWatchLog 但注意到 PutLogEvents 请求有限制 PutLogEvents 请求的最大速率为每秒 5 个请求 每个日志流 即

随机推荐

  • 并行运行子进程

    我有一个 python 脚本 它必须调用某个应用程序 3 次 这些调用应该是并行的 因为它们需要几个小时才能完成并且彼此不依赖 但他们的脚本应该停止 直到所有脚本都完成 然后做一些清理工作 这是一些代码 do some stuff for
  • 重新安装 Android studio 会导致我的 Google Maps API 无法在我的应用程序中显示吗?

    我创建了一个利用 Google Maps API 的应用程序 我总是通过将其副本保存在外部驱动器上来备份我的应用程序 我最近重新安装了 Windows 并且不得不重新安装 Android Studio 当我导入保存的应用程序项目并运行它时
  • jQuery 禁用链接直到页面加载

    我有一个附加到链接的 jquery 弹出窗口 如果单击链接时页面未完全加载 即 js 文件 它将在浏览器窗口中打开 而不是弹出窗口 我正在考虑禁用 隐藏链接 直到加载页面 处理这种情况的最佳实践是什么 您有任何代码示例吗 首先将链接放在 d
  • 如何动态添加新值以选择 jira 中的列表字段或使用插件

    这是我的用例 1 我有一个 客户名称 文本字段和 所有客户 单选列表 2 问题解决后 我想选择 客户名称 中存在的值 并希望添加到 所有客户 中 如果要添加的值已存在于 所有客户 中 我就能够实现此目标 但我想用新值填充 所有客户 字段 如
  • Dragula JS通过点击事件从一个列表移动到另一个列表

    我使用 Dragula JS 进行拖放功能 并且我还希望可以选择通过单击鼠标来来回移动列表中的元素 而不会失去拖放功能 我该如何实现这一点 所以我单击元素 1 它将移动到列表中 我从该列表中将其单击回来 它就会向后移动 就是这个想法 如果有
  • Oracle 日期差值获取年数

    有没有办法计算日期之间的年数 不知道如何在考虑跳跃和不考虑什么的情况下做到这一点 是否可以在 SELECT 中执行 IF 语句 Thanks I d use months between 可能与floor select floor mont
  • 为什么使用 number_format() 我的数值会发生变化?

    下面的代码给了我两个不同的输出 number 1562798794365432135246 echo number echo number format number 谁能解释一下吗 编辑 忘了提及 上面给了我 15627987943654
  • 将 XPCOM 组件公开给网页中的 javascript

    我想编写一个 XPCOM 组件 该组件在网页中作为 JavaScript 对象公开 我正在寻找像 Google Gears 这样的东西 也就是说 安装 Google Gears Firefox 扩展后 任何想要使用它的网页都可以使用 jav
  • 使 Windows 服务像从特定用户运行一样运行

    我想创建一个 Windows 服务来安装和卸载真密码 http www truecrypt org 体积 这个问题与 true crypt 无关 所以如果您不知道该程序是什么也没关系 True Crypt 只是一个使您能够加密数据的程序 当
  • 从 PHP 上传多个文件到 Amazon S3

    有没有一种方法可以一次性上传多个文件 而不必为每个文件重新连接 我使用 S3 作为我的 php 应用程序的存储 该应用程序需要存储大量 一次 100 个 大多数较小 大约 10k 的图像文件 目前我正在循环遍历它们并使用以下代码为每个单独上
  • ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败

    我刚刚将我的 Web 应用程序从 ASP NET Framework MVC 升级到 ASP NET Core 2 2 该应用程序在 IIS Express 下运行良好 但是当我尝试在 IIS 下运行它时 它会给出一般错误 HTTP 错误
  • react-test-renderer create() 与 @testing-library/react render()

    我是 React 新手 对所有测试库感到困惑 我的测试代码可以工作 但调用似乎是多余的create 来自react test renderer以便使用它的toMatchSnapshot 并且必须打电话render 来自 testing li
  • 如何使用 C# 将 json 插入到 cosmos db 集合中

    我有一个 Json 文件 我想将其存储在 cosmos DB 集合中 如何使用 C 添加完整的 Json 文件 有同样的客户端库吗 我已经浏览过以下网址微软网址 https learn microsoft com en us azure c
  • 在 python 3 中使用 python 2 架子

    我将数据存储在使用 python 2 7 创建的架子文件中 当我尝试从 python 3 4 访问该文件时 出现错误 gt gt gt import shelve gt gt gt population shelve open shelve
  • jQuery 向上计数

    我不太擅长 javascript 但我希望有一个漂亮的小动画 可以向上计数数字 我发现了this http sophilabs github io jquery counter 在 Github 上 但是速度很慢 我正在计算一个小数点后10
  • Django Collectstatic 命令在 AWS Elastic Beanstalk Amazon Linux 2 Python 3 平台中失败

    几天来 我一直在努力使用 Amazon Linux 2 Python 3 7 平台将 Django 应用程序部署到 Elastic Beanstalk 设法部署应用程序后 我无法运行命令python3 manage py collectst
  • 如何在 didSelectRowAtIndexPath 之后运行prepareForSegue?

    我正在尝试获取indexPath row该用户单击 然后检查我的数组以从中返回一个字符串indexPath row然后通过prepareforSegue发送字符串 但它不起作用 我认为该程序在之前运行了prepareForSeguedids
  • SignalR hub 中的上下文为空

    我有一个 Web 表单应用程序并进行测试 以了解 SignalR 如何满足我的要求之一 我的中心代码 using System using System Collections Generic using System Linq using
  • pip install enum 无法正常工作,显示“intflag”的错误没有

    pip 安装枚举 不工作显示错误 AttributeError 模块 enum 没有属性 IntFlag enum34 is the stdlib Enum backport but it only supports features fo
  • 在 python 中并行化这个嵌套 for 循环

    我再次努力提高这段代码的执行时间 由于计算确实非常耗时 我认为最好的解决方案是并行化代码 我首先使用地图 如中所述this https stackoverflow com questions 29217088 parallelize a n