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

2024-04-26 14:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始自学python,并将这种语言用于算法的在线课程。由于某种原因,我为这门课程创建的许多代码都非常慢(相对于过去我创建的C/C++代码),我开始担心我没有正确使用Python。你知道吗

下面是一个简单的python和matlab代码,比较它们的速度。你知道吗

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代码处理非常复杂的问题非常慢。例如,作为一个硬件分配,我在一个有大约900000个节点的图上运行深度优先搜索,这将花费永远的时间。非常感谢。你知道吗


Tags: 代码in算法语言for硬件软件range
3条回答

不幸的是,python惊人的灵活性和易用性是以缓慢为代价的。而且,对于如此大的迭代值,我建议使用itertools模块,因为它有更快的缓存。你知道吗

xrange是一个很好的解决方案,但是如果您想迭代字典之类的,最好使用itertools,因为您可以迭代任何类型的sequence对象。你知道吗

性能是not an explicit design goal of Python

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

这就是为什么Python与许多高性能计算后端引擎集成的原因之一,例如numpyOpenBLAS甚至CUDA,仅举几个例子。你知道吗

如果您想提高性能,最好的方法是让高性能库为您完成繁重的工作。在Python中优化循环(使用xrange而不是python2.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上运行的结果(图): Performance of integer addition in Python

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

请注意,Numpy解决方案的执行速度是原始解决方案的80倍以上。如果你的计时是正确的,这将比Matlab更快。。。你知道吗

关于DFS(Depth affirst Search)的最后一点说明:here是一篇关于Python中DFS的有趣文章。你知道吗

尝试使用xrange而不是range。你知道吗

它们之间的区别是**xrange**在使用值时生成值,而不是range,后者试图在运行时生成静态列表。你知道吗

相关问题 更多 >