代码运行速度越快越好。如果我想构建一个代码来执行一些数值模拟,通常情况下,我有可能将一个方程展开为“原始”操作
我一直在想一些数学运算的计算成本是多少:
我创建了以下脚本来度量此操作:
# Import necessary modules
import numpy as np
import time
import matplotlib.pyplot as plt
# Define functions to test
def summation(value):
return value+value
def subtraction(value):
return value-value
def multiplication(value):
return value*value
def division(value):
return value/2
def square(value):
return value**2
def sin(value):
return np.sin(value)
# Function that will evaluate the execution time
def time_execution(func, valueToEvaluate, nOuterCycles, nCycles):
store = np.zeros( nOuterCycles)
for i in range( nOuterCycles):
start = time.time()
for j in range(nCycles):
func(valueToEvaluate)
end = time.time()
store[i]=(end-start)
meanCycleTime=np.round(np.mean(store)*1e9/nCycles)
stdCycleTime=np.round(np.std(store)*1e9/nCycles,2)
print("%s takes %s ns.\u00B1 %s ns per loop (mean ± std. dev. of %s runs %s loops each)" %(func.__name__,meanCycleTime,stdCycleTime,nOuterCycles,nCycles))
return func.__name__,meanCycleTime,stdCycleTime
# Time execution parameters
nCycles=1000000
nOuterCycles=5
value=1.1
# Executes the functions and appends the results to a list
valuesForPlot=[]
valuesForPlot.append(time_execution(summation,value,nOuterCycles,nCycles))
valuesForPlot.append(time_execution(subtraction,value,nOuterCycles,nCycles))
valuesForPlot.append(time_execution(multiplication,value,nOuterCycles,nCycles))
valuesForPlot.append(time_execution(division,value,nOuterCycles,nCycles))
valuesForPlot.append(time_execution(square,value,nOuterCycles,nCycles))
valuesForPlot.append(time_execution(sin,value,nOuterCycles,nCycles))
## Bar plot
# Collect entries for the plot
x_names = []
y_values = []
error = []
for i in valuesForPlot:
x_names.append(i[0])
y_values.append(i[1])
error.append(i[2])
fig, ax = plt.subplots()
ax.bar(x_names, y_values, yerr=error,align='center', alpha=0.5, ecolor='black', capsize=10)
ax.set_ylabel('Time of operation [s]')
ax.yaxis.grid(True)
plt.tight_layout()
plt.show()
在我的计算机上,我的结果如下:
summation takes 85.0 ns.± 2.99 ns per loop (mean ± std. dev. of 5 runs 1000000 loops each)
subtraction takes 82.0 ns.± 2.25 ns per loop (mean ± std. dev. of 5 runs 1000000 loops each)
multiplication takes 74.0 ns.± 0.87 ns per loop (mean ± std. dev. of 5 runs 1000000 loops each)
division takes 85.0 ns.± 1.52 ns per loop (mean ± std. dev. of 5 runs 1000000 loops each)
square takes 103.0 ns.± 2.06 ns per loop (mean ± std. dev. of 5 runs 1000000 loops each)
sin takes 779.0 ns.± 2.61 ns per loop (mean ± std. dev. of 5 runs 1000000 loops each)
我在网上(https://streamhpc.com/blog/2012-07-16/how-expensive-is-an-operation-on-a-cpu/和其他网站上读到,我选择的数学运算应该按以下顺序排列: 求和与减法<;乘法<;部门<;平方<;三等距函数。然而,我得到的求和、减法、乘法和除法的结果并没有实质性的差别。有什么特别的原因吗
致意
目前没有回答
相关问题 更多 >
编程相关推荐