据我了解,Python 列表是作为向量实现的。这就是为什么我无法解释为什么以下代码在 Python 中比等效的 C 代码慢 100 倍(在 3.1.3 中,而在 python 3.2 中“仅”65 倍)。
它只是重复提取列表的最大值,nbExtract
次:
nbValues = int(input())
nbExtract = int(input())
values = [int(value) for value in input().split()]
for loop in range(nbExtract):
idMax = 0
for idValue in range(nbValues):
if values[idMax] < values[idValue]:
idMax = idValue
print(values[idMax], end = ' ')
values[idMax] = values[nbValues- 1]
nbValues= nbValues - 1
注意:nbExtract
可以小于 log(nbValues),因此对值进行排序通常较慢
我知道如何更快地做到这一点(例如使用内部 max
函数),但这是针对高中生的练习,我们只教他们基础知识(if/else、for、while 和 lists) ,而不是 Python 中可用的所有函数。
有没有办法在保持相同结构的同时提高速度?我试过 Python 的数组,但速度差不多。
有谁知道为什么在内部 Python 处理列表的速度要慢得多?
根据要求,等效的 C 代码:
#include <stdio.h>
int main()
{
int nbValues, nbExtract ;
scanf("%d%d", &nbValues, &nbExtract);
int values[nbValues];
for (int idValue = 0; idValue < nbValues; idValue++)
scanf("%d", &values[idValue]);
for (int loop = 0; loop < nbExtract; loop++)
{
int idMax = 0;
for (int idValue = 0; idValue < nbValues; idValue++)
if (values[idMax] < values[idValue])
idMax = idValue;
printf("%d ", values[idMax]);
values[idMax] = values[nbValues - 1];
nbValues--;
}
return 0;
}
【问题讨论】:
你能发布等效的 C 代码吗?
Python 是否检查所有数组访问的越界情况?
另外,慢 100 倍有关系吗?
恕我直言,Python 只是比 C 更好地暴露了算法的缓慢性
我很困惑 .. 你在教 Python 但你不知道它是如何工作的?
标签:
python
c
arrays
performance
list
本文链接:http://task.lmcjl.com/news/7461.html