【问题标题】:Python lists vs C arrays : 100x slower? [closed]Python 列表 vs C 数组:慢 100 倍? [关闭]
【发布时间】:2023-04-06 12:12:01
【问题描述】:

据我了解,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