`

python代码优化笔记,cython等

阅读更多
本文主要是整理看过的不错的文章,具体内容请参考对应链接

1、内存
__slots__使得不用为每个实例分配一个__dict__,对于数量巨多的小对象内存优化显著(降到1/4)
使用cython, 小对象降到使用__slots__的1/2不是问题,参见:http://cython.readthedocs.io/en/latest/src/reference/extension_types.html


2、速度
各种小的注意事项:https://wiki.python.org/moin/PythonSpeed/PerformanceTips
  • 循环外c=time.time;  循环内用 c() 替代带点的操作 time.time()
  • 将import写在需要多次调用的函数外面,尤其是函数很简短时


知乎上的讨论numba等:https://www.zhihu.com/question/24695645

通过Python-C-Api,Ctypes,swig或cython等调用c实现(很不错的文章):https://segmentfault.com/a/1190000000479951



3、cython相关资料
注意:pydev代码提示,对于编译后的动态链接库,需要在Forced Builtins手动添加.so的变量名(对于openCV为cv2,对于自己的模块,比如LC.moduleA.so, 需要添加LC.moduleA)http://www.pydev.org/manual_101_interpreter.html

很赞的第三方(numpy,直接操作numpy的指针等)示例
http://notes-on-cython.readthedocs.io/en/latest/std_dev.html

cython官网的一些文档:
  入门(很简单):http://cython.readthedocs.io/en/latest/src/quickstart/build.html
  类:http://cython.readthedocs.io/en/latest/src/reference/extension_types.html
  str相关(注意在cython的class中是可以通过cdef 定义python中的类型的,比如str):http://cython.readthedocs.io/en/latest/src/tutorial/strings.html
  使用openMP:http://cython.readthedocs.io/en/latest/src/userguide/parallelism.html?highlight=loop
  cython结合numpy:http://cython.readthedocs.io/en/latest/src/tutorial/numpy.html
  Typed Memoryviews(新的传递numpy数组的方式,更清晰,但速度稍慢):http://cython.readthedocs.io/en/latest/src/userguide/memoryviews.html

  编译选项(string的转换策略,是否启用boundscheck等):http://cython.readthedocs.io/en/latest/src/reference/compilation.html#compiler-directives

增量编程(主代码在py文件中, 可以转为c的定义在pyx文件中):http://cython.readthedocs.io/en/latest/src/tutorial/memory_allocation.html

代码效率分析:
cython -a --cplus code.pyx #无需指定额外cpp和h文件路径

参考自:https://zhuanlan.zhihu.com/p/24311879


4、 多线程,多进程
对比测试,GIL知识参见:http://stackoverflow.com/questions/10154487/how-to-get-a-faster-speed-when-using-multi-threading-in-python

多进程: 可以多核并行执行,但是参数是通过序列化和反序列化在进程间传递的,因而,多进程适用于输入,输出参数都很小,但是采用纯python代码进行大量运算的情况

多线程: 由于GIL(Global Interpreter Lock)的存在,只适用于IO密集型程序(不受GIL限制的扩展程序除外,比如在cython中使用nogil);CPU密集型程序反而会导致性能下降(都需要python解释器进行解释,但只有获得GIL的线程才能够执行)。。。

心得:   先启动无需GIL的线程,再启动需要GIL的线程
需要两个线程,一个是第三方GPU程序,耗时较长,另一个是python程序,耗时稍短,如果一个在主线程中执行,一个通过Thread在另外的线程中执行,将哪一个放在新的线程中?  答案是GPU程序,因为如果将python程序放在另外一个线程中,就需要先启动该线程,该线程释放GIL需要一定的时间,会导致GPU程序的启动时间滞后。 即使这两个程序都放在新的线程中执行,也必须先启动GPU程序,因为GPU程序会立即释放GIL,而python程序会先运行一段时间再释放GIL,只有释放了GIL,主线程中启动GPU程序的命令才会被执行

5、编码问题
关于python2为什么不推荐使用sys.setdefaultencoding("utf-8")
http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script
个人觉着只要能解决问题就行,毕竟python3默认就是utf-8了
分享到:
评论

相关推荐

    07-python-Cython 语法-class 和 cdef class,使用 C++-Typed memoryviews

    在07.04-python-Cython 语法,调用其他C库.ipynb文件中,你可能会看到如何使用`ctypes`或者CFFI(Foreign Function Interface)来导入C函数,并在Cython代码中直接调用。这样,你可以利用已有的C库优化Python代码,...

    Python中的程序优化(基础笔记)

    综上所述,Python程序优化涉及代码结构、数据结构选择、函数式编程、C扩展、算法优化、资源管理、并发处理等多个方面。通过深入理解和实践这些技巧,我们可以编写出既简洁又高效的Python代码。这份"Python中的程序...

    07-python-简介-扩展模块-cython基础

    Cython的基本思想是,它允许开发者用接近Python的语法编写代码,但通过类型声明和优化,能够生成高效的C源代码,进一步编译为C扩展模块。这样,你可以充分利用Python的便利性,同时享受到接近C的速度。 在“07.02-...

    Python源码学习笔记.zip

    10. **性能优化**:Python源码还包含了一些用于性能优化的技巧,例如对内置类型的操作进行了专门的优化,以及如何使用Cython或PyPy等工具提升Python代码的运行速度。 总的来说,"Python源码学习笔记"可能会涵盖以上...

    Python基础学习笔记(注释).doc

    7. 粘性扩展:Python可以与其他语言编写的代码集成,利用Cython或SWIG等工具进行扩展。 8. 开源理念:Python是开放源代码的,拥有庞大的社区支持和丰富的库资源。 9. 库类丰富:Python有众多预封装的库,如NumPy、...

    python核心笔记

    - **其他语言集成**: 通过Cython等工具将Python与C/C++代码集成起来。 ### 结语 《Python核心笔记》不仅涵盖了Python语言的核心内容,还介绍了如何使用Python开发各种类型的应用程序。无论是初学者还是经验丰富的...

    python入门到精通笔记总结

    Python基础笔记总结 Python 是一种动态类型的解释型语言,具有以下特点: 1. Python 解释器本身几乎可以在所有的操作系统中运行。 2. Python 本身设计为可扩展的,并非所有的特性和功能都集成到语言核心之中。 3. ...

    Why Python Rocks for Research By HOYT KOEPKE

    5. **科学计算库**:Python拥有一系列高质量的科学计算库,包括NumPy和SciPy用于数值运算,Cython用于底层优化,IPython提供交互式工作环境,以及Matplotlib用于数据可视化。 6. **文档与社区支持**:Python拥有...

    cec2005real:CEC'2005特别会议基准测试的Python版本

    这是Python封装,其中使用了2005年IEEE进化计算大会大型全局优化特别会议的测试套件的C ++实现。 笔记 如果要使用此代码的任何部分,请引用以下出版物: Suganthan,N。Hansen,JJ Liang,K。Deb,Y.-P. Chen,A。...

    aaa.rar python

    8. **性能优化**:了解Python的GIL(全局解释器锁)限制,以及如何使用Cython、Numba等工具进行性能提升。 9. **并发和异步**:Python的多线程、多进程以及asyncio库提供了并发和异步编程的能力。 10. **文件I/O**...

    记录Python学习.zip

    12. **扩展与C语言接口**:当需要提高性能时,可以通过ctypes库调用C语言编写的库,或者使用Cython等工具将Python代码编译为C扩展。 13. **持续集成与自动化测试**:理解如何使用unittest或pytest进行单元测试,...

    Python高级-全部(html版).zip

    12. **性能优化**:了解Python的性能瓶颈,如何使用cProfile进行性能分析,以及可能的优化策略,如使用cython进行C扩展,或者使用NumPy和Pandas等高性能库。 以上只是一部分可能包含的内容,实际的HTML文档可能会更...

    matlab分时代码-Scipy-Bordeaux-2018:波尔多大学的Python科学课程笔记

    有数百种Python科学软件包,其中大多数构建在numpy,scipy,matplotib,pandas,cython和/或sympy之上。 我们不会在此短期课程中介绍所有内容,但是您应该获得足够的信息来决定您的研究是否可以从Python中受益。 我...

    reedsolomon:纯Python Reed Solomon编码器

    使用python setup.py install从源代码python setup.py install ,如果安装了Cython,则setup.py将尝试构建经过Cython优化的模块creedsolo.pyx 。 您可以通过键入以下内容来覆盖此行为: python setup.py install --...

    sharcnet-cython:SHARCNET的资料,Cython:初探网络研讨会

    利用Cython的流行软件包和库包括:TensorFlow,OpenCV,NumPy,Pandas等。 该网络研讨会将介绍Cython的基本介绍,这是将香草Python转换为Cython的演示,然后是有关如何在我们自己的Compute Canada HPC环境中运行...

    笔记本:越来越多的用Python,OCaml和Julia编写的Jupyter笔记本集合,用于科学示例,算法,可视化等

    纯Python中(),然后通过Cython或Numba作为优化的Python代码。 我还用编写了一个版本(在同一笔记本中),并比较了4种实现! 然后,我将代码发布为Pypy包,请参见 。 几个(包括著名的梅森扭曲器算法)的( ),...

    matlab如何敲代码-python-numpy-mini-course:适用于高性能数值处理的Python/Numpy

    matlab如何敲代码适用于高性能数值处理的Python / Numpy 用于2018年11月15日举行的笔记本和幻灯片。 抽象的 Python是众所周知的慢速语言,为什么它被科学家和机器学习专家广泛使用? 在繁重的数字任务中,一种解释后...

    arch:Python中的ARCH模型

    用Python编写的自回归条件异方差(ARCH)和其他用于金融计量经济学的工具(使用Cython和/或Numba来提高性能) 公制 最新发布的 持续集成 覆盖范围 代码质量 引文 文献资料 模块内容 Python 3 arch仅适用于...

    学习笔记5_逐层可视化图像特征-薛开宇1

    `requirements.txt`文件列出了Caffe所依赖的Python库,如Cython、h5py、matplotlib等。手动安装这些库可以通过运行`sudo pip install <library_name>`命令完成。`ipython`和`ipython notebook`是用于交互式编程和...

Global site tag (gtag.js) - Google Analytics