使用 cython 加速数千个集合操作

2024-04-10

我一直在努力克服对 Cython 的恐惧(恐惧是因为我对 c 或 c++ 一无所知)

我有一个函数需要 2 个参数,一个集合(我们称之为testSet)和一个集合列表(我们称之为targetSets)。然后该函数会迭代targetSets,并计算与的交集长度testSet,将该值添加到列表中,然后返回该列表。

现在,这本身并没有那么慢,但问题是我需要对 testSet 进行模拟(数量很大,约 10,000 个),而 targetSet 大约有 10,000 个集长。

因此,对于要测试的少量模拟,纯 Python 实现大约需要 50 秒。

我尝试制作一个 cython 函数,它成功了,现在运行时间约为 16 秒。

如果我可以对任何人都能想到的 cython 函数做任何其他事情,那就太好了(python 2.7 btw)

这是我的 Cython 实现重叠函数.pyx

def computeOverlap(set testSet, list targetSets):
    cdef list obsOverlaps  = []
    cdef int i, N
    cdef set overlap
    N = len(targetSets)
    for i in range(N):
        overlap = testSet & targetSets[i]
        if len(overlap) <= 1:
            obsOverlaps.append(0)
        else:
            obsOverlaps.append(len(overlap))
    return obsOverlaps

and the setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("overlapFunc", 
                         ["overlapFunc.pyx"])]

setup(
      name = 'computeOverlap function',
      cmdclass = {'build_ext': build_ext},
      ext_modules = ext_modules
      )

以及一些代码来构建一些随机集以进行测试并对函数进行计时。test.py

import numpy as np
from overlapFunc import computeOverlap
import time

def simRandomSet(n):
    for i in range(n):
        simSet= set(np.random.randint(low=1, high=100, size=50))
        yield simSet


if __name__ == '__main__':
    np.random.seed(23032014)
    targetSet = [set(np.random.randint(low=1, high=100, size=50)) for i in range(10000)]

    simulatedTestSets = simRandomSet(200)
    start = time.time()
    for i in simulatedTestSets:
        obsOverlaps = computeOverlap(i, targetSet)
    print time.time()-start

我尝试更改 ComputerOverlap 函数开头的 def,如下所示:

cdef list computeOverlap(set testSet, list targetSets):

但当我运行时收到以下警告消息setup.py script:

'__pyx_f_11overlapFunc_computeOverlap' defined but not used [-Wunused-function]

然后当我运行尝试使用该函数的东西时,我收到导入错误:

    from overlapFunc import computeOverlap
ImportError: cannot import name computeOverlap

在此先感谢您的帮助,

Cheers,

Davy


在下面的行中,扩展模块名称和文件名与实际文件名不匹配。

ext_modules = [Extension("computeOverlapWithGeneList", 
                         ["computeOverlapWithGeneList.pyx"])]

将其替换为:

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

使用 cython 加速数千个集合操作 的相关文章

随机推荐

  • 如何使调整 WPF 窗口大小时不那么“滞后”?

    我对 WPF 世界比较陌生 我立即注意到的一件事是 当您调整窗口大小时 窗口内容的绘制是多么滞后 例如 如果窗口边缘有滚动条 则这些滚动条在缩小时将部分隐藏 并且在放大时它们与窗口边框之间有空间 即使在 Visual Studio 中创建的
  • Drupal 6模块安装文件未在数据库中创建表

    我正在使用 Schema API 在 Drupa 6 17 上为我的模块创建表 但这些表并未在数据库中创建 我安装了架构模块 它告诉我 虽然我的模块的架构被识别 但它的表不在数据库中 它出现在 缺失 下 Tables in the sche
  • React Native - 设置 secureTextEntry 时无法更改字体

    const entryInput forwardRef props ref gt return
  • 从 url 获取子域名?

    我需要从 url 中获取一些值 就像如果网址是http www random mysite com 然后我想以某种方式得到random 但是如果使用的话这应该也有效www http or https 网址前面 那么如何才能做到这一点呢 我试
  • 如何使用 ORMLite 查询构建器获取表中的总记录

    如同 select count from tablename 在 ORMLITE 中应该查询什么 我尝试过类似的东西 int total dao queryBuilder select count 如何使用 ORMLite 查询构建器获取表
  • JavaScript .hashchange 性能。它能带来任何放缓吗?

    jQuery hashchange 事件 http benalman com projects jquery hashchange plugin 对我来说 它看起来是目前最成熟的解决方案 如果我错了 请纠正我 我真的很喜欢这个用于操作浏览器
  • Facebook Messenger 平台/机器人欢迎配置出现奇怪错误

    我在为 Messenger 机器人配置欢迎消息时遇到奇怪的错误 我一直在使用相同的代码 如下所示 直到昨晚它一直工作正常 我尝试了 cURL 和Postman https www getpostman com 它们都不起作用 curl X
  • 适用于 Android 的 USB 主机

    I am trying to communicate with my freeduino board which is similar to arduino uno via usb through android device nexus
  • 在Java中检查服务器上的路径是否存在[重复]

    这个问题在这里已经有答案了 我正在创建一个 Java 程序 在其中将文件上传到特定路径上的服务器 我在用jSch for sftp 因此 在上传文件之前 我想检查服务器上是否存在给定的目录 if path exists upload fil
  • 使用 AVAudioEngine 将 AVAudioInputNode 连接到 AVAudioUnitEffect

    我想处理来自设备内置麦克风的音频 AVAudioInputNode 带有音频单元效果 AVAudioUnitEffect 对于我的例子 我正在使用AVAudioUnitReverb 连接中AVAudioUnitReverb导致应用程序崩溃
  • Swift 3:从 UIBezierPath 创建 UIImage

    我有一个UIBezierPath 我最终需要一个UIImageView从中 现在我正在尝试首先创建一个UIImage 然后是一个UIImageView从那 我正在快速工作 并且我已经研究过类似的问题 并且答案要么不起作用 要么产生形状而不是
  • ASP.NET MVC 1 向前兼容 ASP.NET MVC 2 吗?

    我可以使用 MVC 2 程序集顺利运行 MVC 1 应用程序吗 我知道一些 3rd 方工具在 MVC 2 中出现了问题 但我们假设我没有使用这些其他工具 曾经有过重大变化 http go microsoft com fwlink LinkI
  • Pandas:将 Lambda 应用于多个数据帧

    我试图弄清楚如何同时将 lambda 函数应用于多个数据帧 而不需要先将数据帧合并在一起 我正在处理大型数据集 gt 60MM 记录 并且需要格外小心内存管理 我希望有一种方法可以将 lambda 应用于底层数据帧 这样我就可以避免首先将它
  • SSIS Excel 目标空白

    我正在调试一个 SSIS 包 该包从 SQL Server 数据开始 对其进行转换 然后将其放入 Excel 文件中 我在工作中经常这样做 以前从未遇到过这个问题 Excel 文件中没有写入任何行 我将数据查看器附加到通向 Excel 目标
  • Android:如何以编程方式连接/断开 OTG

    我想在我的 Android 设备中以编程方式连接和断开 USB OTG 笔式驱动器 硬盘驱动器等 对于USB 我使用以下路径在连接到PC时绑定 取消绑定USB sys bus usb drivers usb bind or unbind 我
  • Python:读取文件时如何忽略#comment行

    在Python中 我刚刚从文本文件中读取了一行 我想知道如何编写代码来忽略行开头带有哈希 的注释 我认为应该是这样的 for if line contain then process line else end for loop 但我是Py
  • JavaScript 对象如何引用其自身的值? [复制]

    这个问题在这里已经有答案了 假设我有以下 JavaScript var obj key1 it key2 key1 works alert obj key2 此错误显示 key1 未定义 我努力了 this key1 this key1 o
  • 单个部分的垂直滚动

    我必须制作一个具有垂直滚动过渡效果的部分 请观看此处的视频以供参考 https drive google com file d 1Fy4BDqc0 LDrPnEVYuQZdiJ0Pk9qDXA5 view usp sharing https
  • 将自定义对象传递给 Web 服务

    我正在使用 C 并且有 Windows 窗体和 Web 服务 我有一个自定义对象 我想将其发送到网络服务 有时 该对象可能包含大量数据 作为最佳性能 将自定义对象发送到 Web 服务的最佳方式是什么 Web 服务旨在处理自定义对象 只要它们
  • 使用 cython 加速数千个集合操作

    我一直在努力克服对 Cython 的恐惧 恐惧是因为我对 c 或 c 一无所知 我有一个函数需要 2 个参数 一个集合 我们称之为testSet 和一个集合列表 我们称之为targetSets 然后该函数会迭代targetSets 并计算与