专栏首页python3Python 代码精简和优化

Python 代码精简和优化

Python很简单,容易使用,开发效率很高,移植性很好,代码资源也很丰富,被广泛使用。但是Python代码编出来的动态库比较大,python库很全,缺点就是库比较大。

在内存占用方法,随着py库的引入,内存也成倍的增加,这里来讨论下如何来给Python瘦身,以及如何优化内存的占用。

一、如何给Python的动态库瘦身。

Python的代码还是很精练的,所以要减小小代码的大小比较困难,但是仍然有一些思路来减小Python库的大小。

1、strip python动态库。

动态库一般都是包含符号表,这些在调用的时候很有用,但是对于release版本,完全可以把符号表去调,方法就是用strip命令,这样大小可以从八九兆锐减到3兆以内。

2、使用代码优化选项:-O3,该参数会对代码进行最大程度的优化,包括优化生成的二进制代码的大小,缺点是优化后会对调试带来困难。

3、去除代码中的Doc String.

Python的代码里有用PyDoc_STRVAR宏定义的模块的帮助说明,这些是可以去掉的,方法是在configure的时候指定--without-doc-strings,这样生成的pyconfig.h中就会不会有下面的定义:

#define WITH_DOC_STRINGS 1

这可以减小生成的动态库的大小,当然在运行时也可以减小模块的内存的占用,因为这些模块不再包含帮助信息。

4、去掉unicode支持。

python中unicode支持不是必需的,当然python 3另当别论。python中要支持unicode可以采用utf-8编码的方式。去掉unicode的支持可以在configure的时候使用下面的参数:

--enable-unicode=no

这样,在pyconfig.h中会去掉下面的定义:

#define Py_USING_UNICODE 1

二:如何减小Python的扩展库的大小?

Python的扩展库放在lib目录下,可以在lib目录下执行下面的命令来编译Python代码:

python -OO -m compileall .

这样会生成pyo扩展名的库文件,-OO参数会去掉doc string,这样在py文件中注释比较多的时候可以显著减小编译目标文件的大小。

注意不要使用绝对路径:

如python -OO -m compileall /path/to/python/lib 这样使用绝对路径的命令,因为生成pyo文件的时候,,每个函数和类的方法会生成一个一个的code object对象,每个code object都会保存它所在的模块的路径,如果使用绝对路径,在路径比较长的时候,函数又比较多的时候,很显著的增加pyo文件的大小。

当然,在代码运行时,也可以减小内存的占用量。

三、如何裁减扩展库。

有个py2exe的工具可以打包python代码和依赖的动态库,把python所必须的扩展库打包到zip文件中,但是实际上这个zip包往往并不是最精简的。其实裁减的最大难点是要找出所有依赖的模块,可以用下面的方法来找出某个模块所依赖的其它模块:

import importlib
def module_diff(mod):
    import sys
    keys = []
    for key in sys.modules.keys():
        keys.append(key)
    importlib.import_module(mod)
    for key in sys.modules.keys():
        if not key in keys:
            print key,sys.modules[key]

如要查看multiprocessing模块所依赖的模块,可以用下面的命令:

module_diff('multiprocessing')

将会得到下面的输出:

multiprocessing.atexit None
multiprocessing.weakref None
multiprocessing.signal None
threading <module 'threading' from 'C:\Python27\lib\threading.pyc'>
cPickle <module 'cPickle' (built-in)>
_multiprocessing <module '_multiprocessing' from 'C:\Python27\DLLs\_multiprocessing.pyd'>
multiprocessing.os None
multiprocessing.itertools None
multiprocessing.threading None
multiprocessing.util <module 'multiprocessing.util' from 'C:\Python27\lib\multiprocessing\util.pyc'>
multiprocessing.sys None
cStringIO <module 'cStringIO' (built-in)>
multiprocessing._multiprocessing None
multiprocessing.multiprocessing None
thread <module 'thread' (built-in)>
atexit <module 'atexit' from 'C:\Python27\lib\atexit.pyc'>
multiprocessing <module 'multiprocessing' from 'C:\Python27\lib\multiprocessing\__init__.pyc'>
weakref <module 'weakref' from 'C:\Python27\lib\weakref.pyc'>
itertools <module 'itertools' (built-in)>
time <module 'time' (built-in)>
multiprocessing.process <module 'multiprocessing.process' from 'C:\Python27\lib\multiprocessing\process.pyc'

这样就可以知道所依赖的模块了。

 要查看所有的模块,则更简单:

def print_all_module():
    import sys
    keys = []
    for key in sys.modules.keys():
        print key,sys.modules[key]

在代码初始化完后执行上面的函数,就可以知道程序运行所需的模块了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分享13个Python GUI库

    Python是一门高级编程语言。它用于通用编程。Python语言由Guido van Rossum创建,并于1991年首次发布。Python的设计哲学着重于代码...

    py3study
  • Python脚本email

    py3study
  • Python——简介

    互联网公司广泛使用Python来做的事一般有:自动化运维、自动化测试、大数据分析、爬虫、Web 等。

    py3study
  • 这次拿下Python全靠它了!一个交互式的学习资源!

    你的假期余额已不足!在假期的最后一天,我们给大家介绍一本非常 nice 的 Python 学习书——Project Python。

    AI科技大本营
  • Python月薪20K?这20601个岗位缺口更吸引我!

    小时候看动画片《哆啦A梦》时候,特别羡慕它有个神奇百宝袋,如果自己也有那么多道具,人生不知道能美好多少倍啊!即便现在已经慢慢长大,在大学,在工作中,这些宝物都有...

    AI科技大本营
  • 4 个快速的 Python 编译器 f

    Python 其实是一种相当快的语言,但它并不像编译型语言那么快。 这是因为官方实现的 CPython 解释执行的,更准确地说,是 Python 代码被编译为字...

    py3study
  • Python超过R,成为数据科学和机器学习的最常用语言

    近期,数据挖掘资讯网站KDnuggets开展了一项调查,问题是“2016年和2017年,在数据分析、数据科学和机器学习工作中,你使用R、Python、两者都用,...

    小莹莹
  • 基本2D优先堆基本优先队列二叉堆实现优先队列代码实现

    基本优先队列 考虑一种队列:每次取出的数据是队列中最小的元素。这种队列可用于程序调度,作业分配等领域,这种队列被称为优先队列,核心的方法有: Insert()方...

    月见樽
  • 「走进k8s」Docker三剑客之Docker Swarm(九)

    PS:这就是我们的服务编排,都是在三个节点,所谓的编排就是将多个节点变成一个节点来使用,接下来讲的k8s要把docker swarm功能要强大很多,当然也要复杂...

    IT故事会
  • Python 切片

    >>> L = ['Michael', 'Sarah','Tracy', 'Bob', 'Jack']

    py3study

扫码关注云+社区

领取腾讯云代金券