【发布时间】:2009-10-13 17:04:50
【问题描述】:
我对使用 C 和 python 进行插入排序的性能很好奇,但我得到的结果让我想是不是我做错了什么。我怀疑 C 会更快,但没那么快。
我已经对这两个代码进行了概要分析,插入排序功能是花费时间最多的地方。
这里是 C 函数:
void
insert_sort (vec_t * vec)
{
int j;
for (j = 1 ; j < vec->n ; j++){
int key = vec->v[j];
int i = j - 1;
while (i >= 0 && vec->v[i] > key){
vec->v[i+1] = vec->v[i];
i--;
}
vec->v[i+1] = key;
}
}
这里是python函数:
def insert_sort (ln):
for j in range(1, len(ln)):
key = ln[j]
i = j-1
while i >= 0 and ln[i] > key:
ln[i+1] = ln[i]
i-=1
ln[i+1] = key
测试使用 10000 个整数,每个整数在 0 到 10000 之间随机生成。
每个函数所用时间的结果是:
- C 时间:0.13 秒
- python 时间:8.104 秒
我在这里做错了吗?就像我说的,我希望看到 C 代码更快,但不是那么快。
我不想使用内置函数或其他任何东西。我想实现该算法。有没有一种 pythonic 方法可以在插入排序中使用?
【问题讨论】:
-
显而易见的答案是pythonic方式是使用内置函数:)。但实际上,我认为代码没有任何问题。 C 被编译,Python 被解释,几乎没有什么比 C for 循环更快的了。它不需要像 Python 那样做几乎所有的工作,因为 Python 在执行代码时会进行引用计数、垃圾收集、获取/释放 GIL 以及其他许多事情。
-
Python 代码在虚拟机 (PVM) 上运行。所以在大多数情况下,plain Python 代码至少比相应的 C 代码慢一个数量级。
-
Python 作为一种解释性语言只慢了大约 60 倍。这在我所期望的范围内。时机看起来不错。
-
Python 的强大之处在于它的内置函数/类型(Python 或多或少仍然是一种胶水语言)。尝试编写一个广泛使用哈希表的算法,您将很难在 C 中使其更快。
-
请提供有关您的测试方法的更多详细信息。在我的机器上对 10,000 个随机整数进行排序大约需要 6 毫秒。使用 python 的内置排序大约需要 400 微秒。使用 timeit.py 从命令行计时
标签: python c performance profiling