gpt4 book ai didi

python - 如何提高以下 python 代码的性能

转载 作者:太空宇宙 更新时间:2023-11-03 16:51:11 25 4
gpt4 key购买 nike

我写了如下所示的这段代码。我遇到了严重的性能问题。尤其是 i 循环 5000 万次的循环(for z in range(total):) 看起来非常慢。我可以修改它以提高效率吗? - 也许修改它在 r1,r2 中存储最后 10 个值之和的方式?

import numpy as np
import math
import scipy.stats as sp

# Define sample size
sample=4999999
cutoff=int((sample+1)/100)
# Define days for x-day VaR
xdays=10

# Calculate the whole sample size and extended total sample size
size=sample*xdays+xdays-1
total=size+xdays
cutoff_o=int((size+1)/100)


# Sample values for kurtosis
#kurt=[0.0000001,1.0,2.0,3.0,4.0,5.0,6.0,10.0]

kurt=[6.0]

# Number of repetitions
rep=2

# Define correlation coefficient
rho=0.5

# Loop for different iterations
for x in range(rep):
uni=sp.uniform.rvs(size=total)

# Loop for different values of kurtosis
for y in kurt:
df=(6.0/y)+4.0

# Initialize arrays
t_corr=np.empty(total)
n_corr=np.empty(total)
t_corr_2=np.empty(total)

r1=np.empty(sample)
r2=np.empty(size)

r3=np.empty(sample)
r4=np.empty(size)

# Define t dist from uniform
t_dist=sp.t.ppf(uni,df)
n_dist=sp.norm.ppf(uni)

# Loop to generate autocorrelated distributions
for z in range(total):
if z==0:
t_corr[z]=t_dist[z]
n_corr[z]=n_dist[z]
t_corr_2[z]=sp.t.ppf(sp.norm.cdf(n_corr[z]),df)
else:
t_corr[z]=rho*t_dist[z-1] + math.sqrt((1-rho**2))*t_dist[z]
n_corr[z]=rho*n_dist[z-1] + math.sqrt((1-rho**2))*n_dist[z]
t_corr_2[z]=sp.t.ppf(sp.norm.cdf(n_corr[z]),df)
if z>xdays-1:
z_x=int(z/xdays)-1
if (z%xdays)==0 and z_x<sample:
r1[z_x]= sum(t_corr[z-10:z])
r3[z_x]= sum(t_corr_2[z-10:z])

r2[z-xdays]= sum(t_corr[z-10:z])
r4[z-xdays]= sum(t_corr_2[z-10:z])

print (np.partition(r1, cutoff-1)[cutoff-1], np.partition(r3, cutoff-1)[cutoff-1], np.partition(r2, cutoff_o-1)[cutoff_o-1], np.partition(r4, cutoff_o-1)[cutoff_o-1])
print ()

最佳答案

一些建议:

不必要的 ifs

首先,您可以从循环中删除 if 语句。当程序员知道 z 在第一个循环中等于 0 时,检查 z == 0 数百万次似乎有点不必要。 if z>xdays-1 也是如此:

if z==0:
t_corr[z]=t_dist[z]
n_corr[z]=n_dist[z]
t_corr_2[z]=sp.t.ppf(sp.norm.cdf(n_corr[z]),df)

for z in range(1, xdays - 1):
t_corr[z]=rho*t_dist[z-1] + math.sqrt((1-rho**2))*t_dist[z]
n_corr[z]=rho*n_dist[z-1] + math.sqrt((1-rho**2))*n_dist[z]
t_corr_2[z]=sp.t.ppf(sp.norm.cdf(n_corr[z]),df)

for z in range(xdays - 1, total)
t_corr[z]=rho*t_dist[z-1] + math.sqrt((1-rho**2))*t_dist[z]
n_corr[z]=rho*n_dist[z-1] + math.sqrt((1-rho**2))*n_dist[z]
t_corr_2[z]=sp.t.ppf(sp.norm.cdf(n_corr[z]),df)
z_x=int(z/xdays)-1
if (z%xdays)==0 and z_x<sample:
r1[z_x]= sum(t_corr[z-10:z])
r3[z_x]= sum(t_corr_2[z-10:z])
r2[z-xdays]= sum(t_corr[z-10:z])
r4[z-xdays]= sum(t_corr_2[z-10:z])

请仔细检查;我刚刚把它扔掉了:)

编译你的代码!

一个廉价/黑客修复实际上可以提供一些严重的好处!您可以尝试将 python 代码编译为二进制文件,例如使用 Cython。实际上,我用一个人为的但与您的示例相似的示例对此进行了测试,我希望它能为您提供足够的信息来开始。假设我有以下 python 脚本:

import math

for j in range(1000):
for i in range(1000):
a = math.sqrt(i) * math.sqrt(j)

在我的 Ubuntu VM 上使用 python3 fast.py 运行它始终需要 0.4 秒的实时时间。运行以下命令:

$ cython3 --embed -o fast.c fast.py
$ gcc -I /usr/include/python3.4m/ -o fast fast.c -lpython3.4m

从我的Python代码生成一个.c文件,并自动为我编译二进制fast。现在运行可执行文件的平均实时时间为 0.14 秒 - 一个巨大的改进!

减少列表切片(编辑 - 没有帮助,这是 NumPy 切片而不是列表切片!)

另一个问题可能与您的列表切片有关。请记住,切片表示法涉及每次创建一个新列表,这意味着您将使用四个切片创建约 200,000,000 个新列表。现在我不确定这会更快,但您可以在不复制的情况下实现相同的行为,例如:

sum(t_corr[z-10:z])

可以替换为

sum(t_coor[i] for i in range(z, 10))

再次,将其修复为您真正想要的;这只是一个概念作品。

请告诉我这是否有帮助!

关于python - 如何提高以下 python 代码的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35830050/

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