用python对数学运算进行基准测试

2024-09-29 17:09:52 发布

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

代码运行速度越快越好。如果我想构建一个代码来执行一些数值模拟,通常情况下,我有可能将一个方程展开为“原始”操作

我一直在想一些数学运算的计算成本是多少:

  • 总和
  • 减法
  • 倍增
  • 分部
  • 平方
  • 三角函数(如sin)

我创建了以下脚本来度量此操作:

# 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/和其他网站上读到,我选择的数学运算应该按以下顺序排列: 求和与减法<;乘法<;部门<;平方<;三等距函数。然而,我得到的求和、减法、乘法和除法的结果并没有实质性的差别。有什么特别的原因吗

致意


Tags: ofreturntimevaluedefnpmeanstd

热门问题