python - 把python代码翻译成c代码有那么难吗?

标签 python c binary-search inversion

有一次我写了一段Python代码来计算反转。

只是为了好玩,并且想看看 c 是否真的比运行时语言快得多, 我用c写了类似的python代码。

Python 代码运行时间不到 3 秒,

但是我的 C 代码花了大约 8 秒。

谁能告诉我哪里做错了以及我应该如何更改/改进我的 C 代码?

谢谢!!

输入文件只是 100000 行数字,不重复,从 1 到 100000 以随机顺序排列。

Python 代码:

import time

def lookup(arr, num):
    lower=0
    upper=len(arr)-1
    while 1:
        if arr[upper]==num:
            return upper
        mid=(upper+lower)/2
        if arr[mid]==num:
            return mid
        elif arr[mid]<num:
            lower=mid+1
        else:
            upper=mid

def main():
    time.clock()
    f=open("IntegerArray.txt", "r").read().strip().split('\n')
    array=[int(i) for i in f]
    array.reverse()
    s=sorted(array)
    v=0
    while(array):
        i=lookup(s, array.pop())
        v+=i
        s.pop(i)
    print v
    print time.clock()
    raw_input()

main()

C 代码:

#include <stdio.h>
#include <stdlib.h>

#define limit 100000

int comp(const void *, const void *);
void inversion(int *, int *, int);
int lookup(int *, int, int);

int main(void){
    FILE *f = fopen("IntegerArray.txt", "r");
    int n=0, array[limit], copy[limit];
    while(n<limit){
        fscanf(f, "%d", array+n);
        copy[n]=array[n];
        n++;
    }
    qsort(copy, limit, sizeof(int), comp);
    // int i;
    // for(i=limit-100;i<limit;i++)printf("%d %d\n", array[i], copy[i]);
    inversion(array, copy, limit);
    // getchar();
    return 0;
}

int comp(const void  *a, const void *b){
    return (*(int*)a>*(int*)b)?1:-1;
}

void inversion(int *a, int *b, int n){
    int c=0, index;
    unsigned int v=0;
    while(c<n){
        // if(c%1000==0)printf("%d %d\n", c, b[n-c-1]);
        index=lookup(b, *a, n-c);
        v+=index;
        if((n-c)/2<index)
            for(;index<n-c-1;index++)
                b[index]=b[index+1];
        else{
            for(;index>0;index--)
                b[index]=b[index-1];
            b++;
        }
        a++;
        c++;
    }
    printf("%u\n", v);
}

int lookup(int *arr, int num, int n){
    int lower=0, upper=n-1, mid;
    // if(arr[upper]==num)return upper;
    // if(arr[lower]==num)return lower;
    while(1){
        // printf("%d %d %d\n", lower, upper, num);
        mid=(lower+upper)/2;
        // if(lower==upper && arr[mid]!=num){
        //  printf("%d %d %d\n", lower, upper, num);
        //  exit(1);
        // }
        if(arr[mid]==num)return mid;
        else if(arr[mid]<num)
            lower=mid+1;
        else
            upper=mid;
    }
}

最佳答案

在Python反转中,你有:

s.pop(i)

在 C 语言中,您有:

if((n-c)/2<index)
    for(;index<n-c-1;index++)
        b[index]=b[index+1];
else{
    for(;index>0;index--)
        b[index]=b[index-1];
    b++;
}

对我来说看起来有很大的不同。
我不认为 Python 通过复制所有元素来实现 pop

关于python - 把python代码翻译成c代码有那么难吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11338691/

相关文章:

search - 搜索字符串算法

python - 如何将 numpy ndarray 保存为 .csv 文件?

python - 如何从OpenCV Python中的图像获取标题

python - Beautifulsoup 从无序列表中提取文本和链接 div < ul <li (斯堪的纳维亚字符)

c++ - Makefile.am 中的 ifdef

c - STM32F 使用 HAL_CAN 库

c - C语言中使用二分查找查找交错序列

c - 递归二进制搜索函数不会为数组中不存在的值返回 -1

python - 为什么在聚类之前跨行而非列进行数据标准化(预处理)

c - 我们需要在 wordexp 失败时调用 wordfree 吗?