【发布时间】:2019-03-26 22:37:01
【问题描述】:
我编写了一个程序,在 python 和 C 中创建一个从 2 到用户给定数字的素数列表。我运行这两个程序来寻找相同数字的素数,并在活动监视器中查看它们各自的进程。我发现 python 实现使用的内存正好是 C 实现的 9 倍。为什么 python 需要这么多内存,为什么要使用特定的倍数来存储相同的整数数组?以下是该程序的两个实现:
Python 版本:
import math
import sys
top = int(input('Please enter the highest number you would like to have checked: '))
num = 3
prime_list = [2]
while num <= top:
n = 0
prime = True
while int(prime_list[n]) <= math.sqrt(num):
if num % prime_list[n] == 0:
prime = False
n = 0
break
n = n + 1
if prime == True:
prime_list.append(num)
prime = False
num = num + 1
print("I found ", len(prime_list), " primes")
print("The largest prime I found was ", prime_list[-1])
C 版:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/types.h>
#include <unistd.h>
int main(){
int N;
int arraySize = 1;
int *primes = malloc(100*sizeof(int));
int isPrime = 1;
primes[0] = 2;
int timesRealloc = 0;
int availableSlots = 100;
printf("Please enter the largest number you want checked: \n");
scanf("%d", &N);
int j = 0;
int i;
for (i = 3; i <= N; i+=2){
j = 0;
isPrime = 1;
while (primes[j] <= sqrt(i)) {
if (i%primes[j] == 0) {
isPrime = 0;
break;
}
j++;
}
if (isPrime == 1){
primes[arraySize] = i;
arraySize++;
}
if (availableSlots == arraySize){
timesRealloc++;
availableSlots += 100;
primes = realloc(primes, availableSlots*sizeof(int));
}
}
printf("I found %d primes\n", arraySize);
printf("Memory was reallocated %d times\n", timesRealloc);
printf("The largest prime I found was %d\n", primes[(arraySize-1)]);
return 0;
}
【问题讨论】:
-
首先 C 使用汇编语言来执行你的程序,而 Python 使用解释器来执行一些中间代码。 C 中的第二个数组只是内存区域,而在 Python 中它们是(实际上我也不确定)复杂的数据结构。第三,它们可能是没有被垃圾回收的死动态对象。通常,具有丰富类型层次结构和垃圾收集的 OO_languages 比 C 使用更多的内存。
-
Python没有数组,所以不能是“同一个数组”。 C 和 Python 中的 int 类型也有很大不同。
-
@U.Windl 是的,CPython 中的一切都是成熟的对象。 List 对象在底层确实使用了 PyObject 指针的原始数组,但比 C 原始数组要多得多。
-
优秀的研究顺便说一句!
标签: python c python-3.x memory