Cython使用及pycharm

文件总览

.
+-- main.py
+-- fib
|   +-- __init__.py
|   +-- cfib.c
|   +-- cfib.h
|   +-- fib.pyx
|   +-- setup.py

说明:

  1. main.py主程序
  2. __init__.py是模块引用文件
  3. cfib.c用c写的fib函数
  4. cfib.h是cfib的头文件,供fib.pyx参照
  5. fib.pyx是Cython文件
  6. setup.py是用来编译Cython的

代码

cfib.c

#include "cfib.h"

unsigned long fib(unsigned long n) {
    unsigned long a=0, b=1, i, tmp;
    for (i=0;i<n;++i) {
        tmp = a; a = a + b; b = tmp;
    }
    return a;
}

cfib.h

#ifndef __CFIB_H__
#define __CFIB_H__

unsigned long fib(unsigned long n);

#endif

cfib.ccfib.h就是标准的c程序写法,就不赘述,主要拿来比performance的

fix.pyx:定义引用的c函数

cdef extern from "cfib.h":
    unsigned long _fib "fib"(unsigned long n)

def fib_c(n):
    '''Returns the nth Fibonacci number.'''
    return _fib(n)

def fib_cython(n):
    '''Returns the nth Fibonacci number.'''
    a, b = 0, 1
    for i in range(n):
        a, b = a + b, a
    return a

def fib_cython_optimized(unsigned long n):
    '''Returns the nth Fibonacci number.'''
    cdef unsigned long a=0, b=1, i
    for i in range(n):
        a, b = a + b, a
    return a

__init__.py

from .fib import *

setup.py

from distutils.core import setup, Extension
from Cython.Build import cythonize

setup(ext_modules = cythonize(Extension(name="fib", sources=["cfib.c", "fib.pyx"])))

Pycharm

打开PyCharm,到settings => Tools => External Tools,然後点+,新增一个工具,设置如下:
pycharm_cython

Porgram$ModuleSdkPath$即python可执行文件路径
Arguments$FilePath$ build_ext --inplace
Working directory$FileDir$

这样基本上就大功告成了,然后回到Project对setup.py点右键,选External Tools,选CythonBuild就可以看到开始跑了
pycharm_cython_2
如果设置对的话,就可以看到编译成功的信息
pycharm_cython_3
当然为了避免每次编译pyx文件的时候都点击的话,可以直接设置该tool的快捷键。

最后就可以来跑跑看啦,main.py如下:

def fib_python(n):
    '''Returns the nth Fibonacci number.'''
    a, b = 0, 1
    for i in range(n):
        a, b = a + b, a
    return a

if __name__ == '__main__':
    print("##### check result #####")
    import fib
    print("fib(47) in python:", fib_python(47))
    print("fib.fib_c(47):", fib.fib_c(47))
    print("fib.fib_cython(47):", fib.fib_cython(47))
    print("fib.fib_cython_optimized(47):", fib.fib_cython_optimized(47))

    print("\n##### performace benchmark #####")
    import timeit
    python_setup = "from __main__ import fib_python"
    cython_setup = "import fib"
    print("Python code: ", timeit.timeit('fib_python(47)', setup=python_setup), "seconds")
    print("Cython code: ", timeit.timeit('fib.fib_cython(47)', setup=cython_setup), "seconds")
    print("Optimized Cython code: ", timeit.timeit('fib.fib_cython_optimized(47)', setup=cython_setup), "seconds")
    print("C code: ", timeit.timeit('fib.fib_c(47)', setup=cython_setup), "seconds")

输出结果:

C:\Users\*****\Miniconda3\envs\idp\python.exe D:/Dropbox/Data/programming/Python/Cython/1_fib/main.py
##### check result #####
fib(47) in python: 2971215073
fib.fib_c(47): 2971215073
fib.fib_cython(47): 2971215073
fib.fib_cython_optimized(47): 2971215073

##### performace benchmark #####
Python code:  2.9352622053858113 seconds
Cython code:  1.7331176511158422 seconds
Optimized Cython code:  0.14643933094340067 seconds
C code:  0.11884286952119272 seconds

Process finished with exit code 0

参考

Pycharm and Cython

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值