Skip to main content
 首页 » 编程设计

python之我的 python 代码一般都很慢,这正常吗

2025年05月04日21artech

最近开始自学python,一直在用这门语言做算法的在线类(class)。出于某种原因,我为这门类(class)创建的许多代码都非常慢(相对于我过去创建的 C/C++ Matlab 代码),我开始担心我没有正确使用 python。

这是一个简单的 python 和 matlab 代码来比较它们的速度。

编程语言

   for i = 1:100000000 
        a = 1 + 1 
   end  

python

   for i in list(range(0, 100000000)): 
        a=1 + 1 

matlab代码大约需要0.3秒,python代码大约需要7秒。这是正常的吗?我的很多复杂问题的 python 代码非常慢。例如,作为一项 HW 任务,我在一个包含大约 900000 个节点的图上运行深度优先搜索,这需要很长时间。谢谢。

请您参考如下方法:

性能是 not an explicit design goal of Python :

Don’t fret too much about performance--plan to optimize later when needed.

这也是为什么Python集成了很多高性能计算后端引擎的原因之一,比如numpy。 , OpenBLAS甚至 CUDA , 仅举几例。

如果您想提高性能,最好的前进方式是让高性能库为您完成繁重的工作。在 Python 中优化循环(通过使用 xrange 而不是 Python 2.7 中的 range)不会得到非常显着的结果。

下面是一些比较不同方法的代码:

  • 你原来的 list(range())
  • 建议使用xrange()
  • 省略i
  • 使用 numpy 使用 numpy 数组(向量加法)进行加法
  • 使用 CUDA 在 GPU 上做矢量加法

代码:

import timeit 
import matplotlib.pyplot as mplplt 
 
iter = 100 
testcode = [ 
    "for i in list(range(1000000)): a = 1+1", 
    "for i in xrange(1000000): a = 1+1", 
    "for _ in xrange(1000000): a = 1+1", 
    "import numpy; one = numpy.ones(1000000); a = one+one", 
    "import pycuda.gpuarray as gpuarray; import pycuda.driver as cuda; import pycuda.autoinit; import numpy;" \ 
    "one_gpu = gpuarray.GPUArray((1000000),numpy.int16); one_gpu.fill(1); a = (one_gpu+one_gpu).get()" 
    ] 
labels = ["list(range())", "i in xrange()", "_ in xrange()", "numpy", "numpy and CUDA"] 
 
timings = [timeit.timeit(t, number=iter) for t in testcode] 
 
print labels, timings 
 
label_idx = range(len(labels)) 
mplplt.bar(label_idx, timings) 
mplplt.xticks(label_idx, labels) 
mplplt.ylabel('Execution time (sec)') 
mplplt.title('Timing of integer addition in python 2.7\n(smaller value is better performance)') 
mplplt.show() 

结果(图表)在 OSX 上的 Python 2.7.13 上运行:

Numpy 比 CUDA 解决方案执行得更快的原因是使用 CUDA 的开销没有超过 Python+Numpy 的效率。对于更大的浮点计算,CUDA 甚至比 Numpy 做得更好。

请注意,Numpy 解决方案的执行速度比原始解决方案快 80 倍以上。如果您的时间安排正确,这甚至会比 Matlab 更快...

关于 DFS(深度优先搜索)的最后说明:here是一篇关于 Python 中的 DFS 的有趣文章。