gpt4 book ai didi

python - 比较速度 Python 和 Julia

转载 作者:太空狗 更新时间:2023-10-30 01:40:58 26 4
gpt4 key购买 nike

<分区>

我开始编写一个程序来进行非线性光束计算。我选择 Python 是因为它是类似于 Matlab 的代码,我目前正在进行速度测试(以确保 python 是否是进行快速数值计算的正确语言)并尝试熟悉 python3。我尝试了一种算法,计算从 t=1 到 n 的 1/t^2 之和(来自 Julia High Perfromance 一书),以比较 python3 与 julia 的速度。现在我有一些问题:

1) 在我的计算中,Julia 没有预期的那么快? Julia ist JIT 编译。它应该非常快。为什么 python 更快?

2) 为什么 python 中的循环这么慢?

3) 为什么 python sum 方法比 numpy.sum 方法慢

4) 为什么 python 的 sum 函数得到的解决方案与 numpy.sum 函数略有不同?

我希望你能帮助我。

代码:

# Benchmark Python vs Julia
# (from Julia High Performance page 7 from Avik Sengupta)

import scipy as sp
import time

# Sum of 1/t^2 from t = 1 to n by using loops:
# --------------------------------------------
def pisum(w,n):
u_sum = 0
for vi in range(w):
u_sum = 0
for vj in range(1,n+1,1):
u_sum += 1.0/(vj*vj)
return u_sum

# Sum of 1/t^2 from t = 1 to n by using scipy functions:
# ------------------------------------------------------
def pisum1(w,n):
for vi in range(w):
vj = sp.arange(1,n+1,1)
vj = sp.multiply(vj,vj)
u_sum_sp = (sp.divide(sp.ones(n),vj)).sum()
return u_sum_sp

# Sum of 1/t^2 from t = 1 to n by using scipy functions & calculating
# the sum via pure python:
# -------------------------------------------------------------------
def pisum2(w,n):
for vi in range(w):
vj = sp.arange(1,n+1,1)
vj = sp.multiply(vj,vj)
u_sum_py = sum(sp.divide(sp.ones(n),vj))
return u_sum_py

# Benchmarking the methods :
# ==========================

w = 500
n = 10000

# 1) Loops:
# ---------
ta = time.clock()
u_sum_loops = pisum(w,n)
eltime_loops = time.clock() - ta

# 2) scipy:
# ---------
ta = time.clock()
u_sum_sp = pisum1(w,n)
eltime_sp= time.clock() - ta


# 3) scipy & sum via python:
# --------------------------
ta = time.clock()
u_sum_py = pisum2(w,n)
eltime_py= time.clock() - ta

# Julia with loops:
# -----------------
eltime_ju_loops = 0.150857295
u_sum_ju = 1.6448340718480652

row_format = '{:<35} {:<5} {:<5} {:<} {:<}'
print("Overview calculation time:")
print("-"*50)
print(row_format.format("elapsed time using loops:","%.5f" % eltime_loops,"sec. (", "%.2f"% (eltime_loops/eltime_ju_loops),"*time Julia)"))
print(row_format.format("elapsed time using scipy:","%.5f" % eltime_sp,"sec. (", "%.2f"% (eltime_sp/eltime_ju_loops),"*time Julia)"))
print(row_format.format("elapsed time using python:","%.5f" % eltime_py,"sec. (","%.2f"% (eltime_py/eltime_ju_loops),"*time Julia)"))
print(row_format.format("elapsed time using Julia and loops:","%.5f" % eltime_ju_loops,"sec.","","\n"))

line1 = "sum loops:",u_sum_loops
line2 = "sum scipy:",u_sum_sp
line3 = "sum scipy and sum via python:",u_sum_py
line4 = "sum_julia:",u_sum_ju
row_format = '{:<29} {:<18}'
print("Overview Sum:")
print("-"*50)
print(row_format.format(*line1))
print(row_format.format(*line2))
print(row_format.format(*line3))
print(row_format.format(*line4))

# Julia Code:
# ===========

# function pisum(w,n)
# u_sum = 0;
# for vi = 1:w
# u_sum = 0;
# for vj = 1:n
# u_sum += 1.0/(vj*vj);
# end
# end
# u_sum
# end
#
# tic()
# u_sum = pisum(500,10000)
# eltime = toc()

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com