鱼C论坛

 找回密码
 立即注册
查看: 2268|回复: 1

C\C++ 提升Python效率

[复制链接]
发表于 2018-12-7 10:37:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 gapore 于 2018-12-7 10:37 编辑

有没有大佬懂cython的啊?我有段程序想用cython加速一下,但是自己不懂c语言,胡乱编的效果有限

数据来源代码(Python)如下
  1. import numpy as np
  2. import scipy.linalg as linalg

  3. N = 2328
  4. Y = np.random.rand(N)
  5. L = 200   # int in range(2,N/2)
  6. K = N - L + 1

  7. # Embedding
  8. X = linalg.hankel(Y,np.zeros(K))
  9. X = X[:-K+1,:]

  10. # Singular value decomposition (SVD)
  11. Xt = X.T
  12. _,sig,Vt = linalg.svd(X)
  13. Sig = linalg.diagsvd(sig,L,L)
  14. r = np.linalg.matrix_rank(X)
  15. Vt1 = Vt[:r,:]
  16. Sig1 = Sig[:r,:r]
  17. B1 = Sig1.dot(Vt1)
  18. B1t = B1.T
复制代码


我想用最小一乘法求解矩阵 A ,使得 B1t * A = Xt ,编的python代码如下
  1. # coding = utf-8
  2. import numpy as np
  3. cimport cython

  4. def FitLadReg(double[:] endog,double[:,:] exog):
  5.    
  6.     exog_rank = np.linalg.matrix_rank(exog)
  7.     beta = np.ones(exog_rank)
  8.     xstar = exog

  9.     n_iter = 0
  10.     diff = 10
  11.     cycle = False
  12.     history = []
  13.     while n_iter < 1000 and diff > 1e-6 and not cycle:
  14.         n_iter += 1
  15.         beta0 = beta
  16.         xtx = np.dot(xstar.T, exog)   
  17.         xty = np.dot(xstar.T, endog)
  18.         beta = np.dot(np.linalg.pinv(xtx), xty)
  19.         resid = endog - np.dot(exog, beta)

  20.         mask = np.abs(resid) < .000001
  21.         resid[mask] = ((resid[mask] >= 0) * 2 - 1) * .000001
  22.         resid = np.where(resid < 0, 0.5 * resid, 0.5 * resid)
  23.         resid = np.abs(resid)
  24.         xstar = exog / resid[:, np.newaxis]
  25.         diff = np.max(np.abs(beta - beta0))
  26.         history.append(beta)

  27.         if (n_iter >= 300) and (n_iter % 100 == 0):
  28.             # check for convergence circle, shouldn't happen
  29.             for ii in range(2, 10):
  30.                 if np.all(beta == history[-ii]):
  31.                     cycle = True
  32.                     break

  33.     return history
复制代码


编译后调用代码如下
  1. from FitLadReg import FitLadReg
  2. A = np.zeros((r,L))
  3. for i in range(L):
  4.     A[:,i] = FitLadReg(Xt[:,i],B1t)[0]
复制代码

FitLadReg函数cython编译前后效率差不多,请问要怎么改进函数代码呢?谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-7 12:05:57 | 显示全部楼层
你用numba吧……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-13 21:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表