22-股票数据分析:
除权数据前复权和后复权处理
23-股票数据可视化:
自定义Matplotlib版股票行情界面
24-股票数据可视化:
pyecharts实现Web版股票行情界面
25-股票数据可视化:
pyecharts从V0.5至V1版的转变
26-股票数据可视化:
TA-Lib技术指标库的扩展应用
27-股票数据可视化:
用TA-Lib封装更灵活的指标库
28-股票交易策略:线性回归算法建立选股策略
29-股票交易策略:
基于欧奈尔RPS指标选股策略
30-股票交易策略:海龟择时策略入门量化交易
31-股票交易策略:收益与风险维度度量策略效果
32-股票交易策略:择时策略融入ATR风险管理
33-股票交易策略:
择时策略融入ATR动态仓位管理
34-股票交易策略:蒙特卡洛算法最优化策略参数
35-股票交易策略:基于凯利公式的仓位管理
36-量化策略回测:扒一扒量化回测中常见的陷阱
37-量化策略回测:
创建属于自己的回测框架
38-远程下单方案:微信机器人实时提醒交易
39-
效率优化措施:Python扩展C/C++加速执行
【本次加推篇】
40-
结尾篇:贯穿知识点才能学以致用
当我们提到一门编程语言的效率时,通常包含了开发效率和运行效率这两层意思。Python作为一门高级语言,它功能强大,易于掌握,能够快速的开发软件,“life is short,we use python!”,想必这些优点是毋庸置疑的,但是作为一门解释性语言,执行速度的局限性导致在处理某些高频任务时存在不足。
由于Python本身由C语言实现的,开发性能要求较高的程序模块可以通过扩展运行效率更高的C语言来弥补自身的弱点。另外有些算法已经有开源的C库,那么也没必要用Python重写一份,只需要通过Python进行C库的调用即可。
本文通过实例介绍如何在Python程序中整合既有的C/C++语言模块,从而充分发挥Python 语言和C/C++语言各自的优势。
本文所涉及到的C程序的编译为Linux平台。
Python实现测试函数
在文中我们使用Python编写一个递归函数和循环函数,应用Python的计时库timeit测试函数执行10000次所需要的时间分别为57ms和41ms!
当然递归方法使程序的结构简洁,但由于它逐层深入调用的机制使得执行效率不如循环,我们在测试中可以发现每一次递归是新一次的函数调用,会产生新的局部变量,增加了执行时间。
但是即使使用For循环实现也需要41ms时间,接下来我们尝试更快的实现方式。
Python源生调用实现
Python在设计之初就考虑到通过足够抽象的机制让C和C++之类的编译型的语言导入到Python脚本代码中,在Python的官方网站上也找到了扩展和嵌入Python解释器对应的方法。
文中我们将C编写的递归函数存为wrapper.c,作为Python的扩展库。代码见小册。
讲解
如何封装C函数!
同时需要对C函数增加一个型如PyObject* Module_func()的封装接口,该接口用于Python解释器的交互。将封装接口加入至型如PyMethodDef ModuleMethods[]的数组中,Python解释器能够从数组中导入并调用到封装接口。
最后是实现对扩展库的初始化函数,调用Py_InitModule()函数,把扩展库和ModuleMethods[]数组的名字传递进去,以便于解释器能正确的调用库中的函数。
流程式的操作!
安装python-dev包含Python.h头文件
安装命令:sudo apt-get python-dev
在linux环境下wrapper.c编译成动态链接库wrapper.so
Python文件中import wrapper导入动态链接库,在import语句导入库时会执行初始化函数
讲解具体过程!
Python文件中wrapper.fact()方式对C函数调用时,封装函数wrap_fact()先会被调用,封装函数接收到一个Python整形对象,PyArg_ParseTuple将Python整形对象转为C整形参数,然后调用C的factorial()函数并将C整数参数传入,经过运算后得到一个C长整形的返回值,Py_BuildValue把C长整形返回值转为Python的长整形对象作为最终整个函数调用的结果。
公布优化结果!
timeit测试函数wrapper.fact(20)执行10000次所的时间只需要5.9ms。
Python源生调用实现
Python在设计之初就考虑到通过足够抽象的机制让C和C++之类的编译型的语言导
Python内建ctypes库使用了各个平台动态加载动态链接库的方法,并在Python源生代码基础上通过类型映射方式将Python与二进制动态链接库相关联,实现Python与C语言的混合编程,可以很方便地调用C语言动态链接库中的函数。
将C编写的递归函数存为a.c,不需要对C函数经过Python接口封装。代码见小册。
Python文件中调用动态链接库a.so,在Windows平台下,最终调用的是Windows API中LoadLibrary函数和GetProcAddress函数,在Linux和Mac OS X平台下,最终调用的是Posix标准中的dlopen和dlsym函数。
ctypes库内部完成PyObject* 和C types之间的类型映射,使用时只需设置调用参数和返回值的转换类型即可。
公布优化结果!
timeit测试函数libb.factorial(20)执行10000次所的时间需要8.5ms。
Python源生调用实现
文中factorial、factorial_c、factorial_rc分别为Python脚本、ctypes 库和Python源生代码扩展方式来实现函数的执行时间。
通过执行时间对比可以发现调用C函数来扩展Python功能可以大大提高执行速度,而Python自带的ctypes库由于在源生代码上进行封装,执行时间会高于源生代码扩展方式,但ctypes库使用方便,特别适合应用在第三方封装代码,提供动态链接库和调用文档的场合。
更多量化交易内容可扫码以下课程!
—————————————————
与站长失联,海报未更新,直接扫码!
微信关注:‘元宵大师带你用Python量化交易’
相信很多人在显式
调用
dll中
函数
的时候,会遇到相同的问题:
就是我们loadlibrary成功后,明明
调用
的
函数
也是正确的,但是Get
Proc
Address
的地址总是为0!不能获得正确的
函数
地址。
我们先来看我这次出错的示例:
DLL部分
__declspec(dllexport) BOOL xxxxxxx();
xxxxxx()
xxxxxxx;
exe
调用
dll部分
HMODULE hInst;
hInst = LoadLibrary(L"Dll1.dll");
if (NU
#define EXPORT_DLL extern "C" __declspec(dllexport)
#else
#define EXPORT_DLL __declspec(dllexport)
得到
,或者说罗辑思维,作为
一个
国内知识领域企业中声量较大的
一个
,上线了
得到
阅读器可以说颇受行业关注。 从上周起,我在微信、微博、知乎等渠道就收到不少读者的关于
得到
阅读器的咨询,于是下定决心去拿个
得到
阅读器来为大家测评一下,今天就是给大家提交这份测评报告的。测评前,让我们线看看
得到
阅读器的参数图:
得到
阅读器说到高清,不得不提一下目前行业的分辨率的极限,也就是300PPI,
得到
阅读器一上线就以这个分辨...
译者:核子可乐近日,.NET Core 3.0 正式发布。此次新版本包含一系列重要改进,添加了 Windows Forms 与 WPF、添加新的 JSON API、对 ARM64 的支持能力以及全面提高的性能水平等。此外,C# 8 也是此次新版本的重要组成部分,其中包含可空、异步流以及更多模式。F# 4.7 则专注于放宽语法限制,并专门匹配 .NET Standard 2.0。
开发
者现在可以立即将...