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

标签 python matlab performance

最近开始自学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 上运行: Performance of integer addition in Python

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

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

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

关于python - 我的 python 代码一般都很慢,这正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44992717/

相关文章:

python - 从 Pandas 滚动应用函数返回多个值

matlab - 手动绘制带有标记和字符串的图例

c# - OfType<> 与 "is"查询的性能

python - 我无法在 pygame 中移动我的玩家,你知道为什么吗?

python - 使用 KNeighborsClassifier 的 SKlearn 管道

python - 神经网络报告不同激活的相同响应

matlab - Matlab中 double 的算术精度

matlab - 在均匀强度图像中检测物体

c# - 我可以加快我的特殊回合功能吗?

asp.net - 横向扩展 Azure 网站与 Azure Web 角色 - 哪个更快?