cython python3_Cython程序比普通的Python慢??(10M选项3.5s与3.25s Black Scholes)-我缺少什么?...

我在cython代码中的函数之前添加了以下几行,从Cython获得的结果比Python 2.7快

@cython.boundscheck(False)

@cython.wraparound(False)

@cython.cdivision(True)

我的结果是1千万分

%timeit PyBlack(BlackPnL, Black_S, Black_Texpiry, Black_strike, Black_volatility, Black_IR, Black_callput)

1 loops, best of 3: 3.49 s per loop

%timeit CyBlack(BlackPnL, Black_S, Black_Texpiry, Black_strike, Black_volatility, Black_IR, Black_callput)

1 loops, best of 3: 2.12 s per loop

编辑

CyBlack.pyx

from numpy cimport ndarray

cimport numpy as np

cimport cython

cdef extern from "math.h":

double exp(double)

double sqrt(double)

double log(double)

double fabs(double)

cdef double a1 = 0.254829592

cdef double a2 = -0.284496736

cdef double a3 = 1.421413741

cdef double a4 = -1.453152027

cdef double a5 = 1.061405429

cdef double p = 0.3275911

@cython.boundscheck(False)

@cython.wraparound(False)

@cython.cdivision(True)

cdef inline double erf(double x):

cdef int sign = 1

if (x < 0):

sign = -1

x = fabs(x)

cdef double t = 1.0/(1.0 + p*x)

cdef double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x)

return sign*y

@cython.boundscheck(False)

@cython.wraparound(False)

@cython.cdivision(True)

cdef double std_norm_cdf(double x):

return 0.5*(1+erf(x/sqrt(2.0)))

@cython.boundscheck(False)

@cython.wraparound(False)

@cython.cdivision(True)

cpdef CyBlack(ndarray[np.float64_t, ndim=1] BlackPnL, ndarray[np.float64_t, ndim=1] Black_S, ndarray[np.float64_t, ndim=1] Black_Texpiry, ndarray[np.float64_t, ndim=1] Black_strike, ndarray [np.float64_t, ndim=1] Black_volatility, ndarray[np.float64_t, ndim=1] Black_IR, ndarray[np.int64_t, ndim=1] Black_callput):

cdef Py_ssize_t i

cdef Py_ssize_t N = BlackPnL.shape[0]

cdef double d1, d2

for i in range(N):

d1 = ((log(Black_S[i] / Black_strike[i]) + Black_Texpiry[i] * Black_volatility[i] **2 / 2)) / (Black_volatility[i] * sqrt(Black_Texpiry[i]))

d2 = d1 - Black_volatility[i] * sqrt(Black_Texpiry[i])

BlackPnL[i] = exp(-Black_IR[i] * Black_Texpiry[i]) * (Black_callput[i] * Black_S[i] * std_norm_cdf(Black_callput[i] * d1) - Black_callput[i] * Black_strike[i] * std_norm_cdf(Black_callput[i] * d2))

return BlackPnL

setup.py

try:

from setuptools import setup

from setuptools import Extension

except ImportError:

from distutils.core import setup

from distutils.extension import Extension

from Cython.Distutils import build_ext

import numpy as np

ext_modules = [Extension("CyBlack",["CyBlack.pyx"])]

setup(

name= 'Generic model class',

cmdclass = {'build_ext': build_ext},

include_dirs = [np.get_include()],

ext_modules = ext_modules)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值