python - 将 Python 方法转换为 C 扩展的好处?

标签 python c python-extensions

一个比较简单的问题:
如果我将 CPU 绑定(bind)瓶颈方法从 Python 转换为 C 扩展(大致实现相同的算法),

  • 我应该期望速度和性能提高多少?
  • 哪些因素决定了这一点?

更新: 人们似乎在提示缺乏细节。我主要是想了解哪些因素会使一段 Python 代码成为用 C 重写的一个很好的候选者(即,如果原始 Python 受 CPU 限制,什么时候移植到 C 实际上会给你带来速度提升)。

具体而言,这是我正在查看的一段代码。基本上它是一种递归方法,它采用两个列表列表(一个“列”列表,其中每列包含可能进入该列的可能值......基本上是一个模式),并查看是否有可能小于 n (通常是 1 次)更改(更改可能是向列添加新值、添加新列、删除列等)以便有一些值序列(每列一个值)你可以从任何一个模式中构造出来。它在本质上与计算字符串之间的编辑距离非常相似。这是代码:

def CheckMerge(self, schemai, schemaj, starti, startj, \
               changesLeft, path):
#        if starti == 0 and startj == 0:
#            print '\n'
#            print schemai.schema
#            print ''
#            print schemaj.schema
    if starti == len(schemai.schema) and startj == len(schemaj.schema):
        return (True, path)
    if starti < len(schemai.schema):
        icopy = schemai.schema[starti]
    else:
        icopy = []
    if startj < len(schemaj.schema):
        jcopy = schemaj.schema[startj]
    else:
        jcopy = []
    intersect = set(icopy).intersection(set(jcopy))
    intersect.discard('')
    if len(intersect) == 0:
        if starti < len(schemai.schema) and \
            ('' in schemai.schema[starti] or changesLeft > 0):

            if not '' in schemai.schema[starti]:
                changesLeft -= 1
            changesCopy = list(path)
            changesCopy.append('skipi')
            result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj, \
                                     changesLeft, changesCopy)
            if result:
                return (result,steps)
            elif not '' in schemai.schema[starti]:
                changesLeft += 1

        if startj < len(schemaj.schema) and \
            ('' in schemaj.schema[startj] or changesLeft > 0):

            if not '' in schemaj.schema[startj]:
                changesLeft -= 1
            changesCopy = list(path)
            changesCopy.append('skipj')
            result,steps = self.CheckMerge(schemai, schemaj, starti, startj+1, \
                                     changesLeft, changesCopy)
            if result:
                return (result, steps)
            elif not '' in schemaj.schema[startj]:
                changesLeft += 1

        if changesLeft > 0:
            changesCopy = list(path)
            changesCopy.append('replace')
            changesLeft -= 1
            result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj+1, \
                                     changesLeft, changesCopy)
            if result:
                return (result, steps)

        return (False, None)
    else:
        changesCopy = list(path)
        changesCopy.append('merge')
        result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj+1, \
                                     changesLeft, changesCopy)
        if result:
            return (result, steps)
        else:
            return (False, None)

最佳答案

这完全取决于您的代码。 如果您的某些代码受硬件支持,例如,如果您正在计算汉明权重、进行 AES 加密、计算 CRC 或具有可向量化代码,则有针对它们的硬件指令可以提高速度,并且您可以通过 C 代码访问它们,但不能通过 Python 代码访问它们。

关于python - 将 Python 方法转换为 C 扩展的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15319519/

相关文章:

python - numpy 2d 数组(坐标)需要分配到 3D 数组中,分配给某个特定的 bin

c - 在函数内重新分配数组

c - 我该怎么做才能使我的程序在 do while 循环中保持在开关中输入的最小数字?

c - 将数据移入和移出文件 X 位的最佳方法是什么?

python - 如何构建和分发依赖于第三方 libFoo.so 的 Python/Cython 包

python - LinkExtractor 和 SgmlLinkExtractor 的区别

python - 有没有办法优化MYSQL REPLACE功能?

Python卫星跟踪与Orbitron,pyephem-位置不匹配

python - 无法导入使用 SWIG 创建的模块

python - 我可以使用 ctypes 从 C 中嵌入的 python 回调 C 函数吗?