我对使用C和python的insert-sort的性能很好奇,但是我得到的结果只是让我想如果我做错了什么。我怀疑C会更快,但不是那么快。
我已经分析了这两个代码,insert sort函数是花费时间最多的地方。
下面是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秒
蟒蛇时间:8.104秒
我在这里做错什么了吗?正如我所说,我希望看到C代码更快,但没有那么快。
我不想使用内置函数或任何东西。我想实现这个算法。有没有一种蟒蛇式的方法可以让我在插入排序中使用?

最佳答案

Python是一种动态语言,标准实现使用一个解释器来评估代码。这意味着编译后的C代码可以用一条机器指令转义,例如赋值给vec->v[i+1],Python的解释器必须从本地作用域中查找序列变量,查找其类,在类上查找项设置方法,调用该方法。同样的比较,加法。更不用说,执行几乎所有字节码都会导致CPU中的间接分支预测失误,从而导致管道泡沫。
这类代码将从JIT编译到本机代码和运行时类型专门化中受益匪浅,就像unladen swallow和PyPy开始做的那样。
否则,代码就相当于Python,因为如果需要实现插入排序,那么在Python中就是这样做的。这也是非常不通俗的,因为你应该使用非常高效的内置排序。

10-07 12:56
查看更多