簡體   English   中英

Python的實現速度比C快

[英]Python implementation faster than C

如果比較不應該以這種方式工作,我道歉。 我是編程的新手,只是好奇為什么會這樣。

我有一個包含word嵌入(4.5gb)的大型二進制文件。 每行都有一個單詞,后跟嵌入,由300個浮點值組成。 我只是找到總行數。

對於C,我使用mmap:

int fd; 
struct stat sb; 
off_t offset = 0, pa_offset;
size_t length, i;
char *addr;
int count = 0;

fd = open("processed_data/crawl-300d-2M.vec", O_RDONLY);
if(fd == -1){
    handle_error("open");
    exit(1);
}

if(fstat(fd, &sb) < 0){
    handle_error("fstat");
    close(fd);
    exit(1);
}

pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
if(offset >= sb.st_size){
    fprintf(stderr, "offset is past end of file\n");
    exit(EXIT_FAILURE);
}

length = sb.st_size - offset;
addr = mmap(0, (length + offset - pa_offset), PROT_READ, MAP_SHARED, fd, pa_offset);
if (addr == MAP_FAILED) handle_error("mmap");

//Timing only this loop
clock_t begin = clock();
for(i=0;i<length;i++){
    if(*(addr+i) == '\n') count++;
}
printf("%d\n", count);
clock_t end = clock();  
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("%f\n", time_spent);

這需要11.283060秒。

蟒蛇:

file = open('processed_data/crawl-300d-2M.vec', 'r')
count = 0
start_time = timeit.default_timer()
for line in file:
    count += 1
print(count)
elapsed = timeit.default_timer() - start_time
print(elapsed)

這需要3.0633065439997154秒。

Python代碼不會讀取每個字符以查找新行嗎? 如果是這樣,為什么我的C代碼效率低下?

很難說,因為我認為它將嚴重依賴於實現。 但乍一看,Python和C程序之間的主要區別在於C程序使用mmap 它是一個非常強大的工具(你在這里並不需要......)因此可能帶來一些開銷。 由於參考Python實現是用C語言編寫的,很可能是循環

for line in file:
    count += 1

將以一個調用fgets的微小函數循環結束。 我敢打賭,使用fgets的天真C程序將比Python等效的程序略快,因為它將節省所有Python開銷。 但恕我直言,毫無mmap在C中使用mmap效率低於Python中的fgets

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM