c - 使用 C 加速 Python 中的列表操作

标签 c performance python-2.7 list-comprehension

让我们假设 pq 是 Python 中具有公共(public)长度 n 的列表。每个列表都按某种顺序包含 range(n) 的内容(这很重要!)。我们可以假设 n 很小(即不超过 2^16)。我现在使用以下代码定义这些列表上的操作

def mult(p,q):
    return [q[i] for i in p]

显然,mult(p,q) 又是一个按某种顺序包含 range(n) 内容的列表。此 Python 代码是排列组合的示例(请参阅 http://en.wikipedia.org/wiki/Permutation )。

我想让这段代码在 Python 中运行得尽可能快。我尝试用 numpy 数组替换 pq 来看看这是否会加快速度,但在 timeit 测试下差异可以忽略不计(请注意,numpy 不是用上述函数设计的心里)。我还为 Python 编写了一个 C 扩展来尝试加快速度,但这似乎没有帮助(但是我使用了诸如 PySequence_Fast_GET_ITEM 之类的函数,这些函数可能与 Python 本身使用的函数相同)。

是否可以用 C 语言为 Python 编写一种新类型(如此处所述 http://docs.python.org/2/extending/newtypes.html ),该类型具有上述 mult 函数更快的属性(呃)?或者,事实上,用 C 语言编写任何程序都可以为 Python 提供这样的类型。

我问这个问题是为了看看我是否找错了树。特别是,Python 本质上是否存在某些固有属性,这意味着它永远无法加速?我主要对 Python 2.7 感兴趣,但有兴趣了解 Python 3+ 的任何解决方案。

最佳答案

正如 Abid Rahman 的评论所示,正确使用 NumPy 比实现您自己的 C 数据结构更好。

import numpy as np

p = np.array(range(1000))
q = np.array(range(1000))

%timeit [q[i] for i in p]
# 1000 loops, best of 3: 312 us per loop

%timeit q[p]
# 100000 loops, best of 3: 4.31 us per loop

NumPy 基本上做了您希望自己做的事情(将数组访问下推到 C 级别)。但是,如果您只进行列表理解,所有循环都将在 Python 中处理,因此它不会比原始的常规 Python 列表快很多。

关于c - 使用 C 加速 Python 中的列表操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888116/

相关文章:

c - C 程序中文件读取的尴尬行为(SIGSEGV 信号)

c - 在 Centos 7 的 libgcrypt 中找不到宏

c - 每第 N 个单词插入字符串

Java合并排序算法与wait()/notify()同步

asp.net - Windows Azure 中的 DNS 查找时间

python - EOFError 在使用 PYTTSX 时随机出现,我的代码现在不断抛出此错误?几个小时前它工作得很好

python - 按照 init 中显示的顺序表示一个类,无需硬编码

python - 有没有办法在 Python 2 中访问分数的分母

c++ - 如何通过 cstdio::scanf 在一行中读入三个整数?

performance - 查找数字的最快方法是什么?