针对python运行速度慢和代码加密困难的解决办法
在上一篇文章中我们有讲到python的一些缺点,那针对这些缺点有什么解决办法吗?答案是有的。下面我们就一起来看看。
python运行速度慢
Python运行的慢是历来被诟病的,一方面和语言有关,另一方面可能就是你的代码问题。语言方面的问题我们解决不了,所以只能在编程技巧上来提高程序的运行效率。下面就分享几个提高运行效率的编程方法。
1.使用哈希表的数据结构
如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环。
items = ['s','b',..,'100m'] #1000s of items found = False for i in items: if (i == '100m'): found = True
可以改写为
items ={‘a’:’a’,’b’:’b’,..,’100m’:’100m’} found = False if‘100m’in items: found = True
2.矢量化取代循环
尽量使用C构建的python库,例如Numpy,Scipy和Pandas,并且利用矢量化同时处理来取代程序中编写多次处理数组单个元素的循环,循环可能是程序优化最容易被拿来开刀的地方了。举例:在对数组中每个元素求平方时直接用数组相乘,而不是两个for循环。
import numpy as np array = np.array([[1.,2.,3.],[4.,5.,6.]]) m_array =array*array
3.精简代码行数
在编程时,尽量使用一些python的内置函数来精简代码行数,是代码显得简洁凝练,大大提高代码运行效率。
newlist =[] def my_fun(a): return a + ’t’ for w in some_list: newlist.append(my_fun(w))
可以改写为
def my_fun(a): rturn a + ’t’ newlist = map(my_fun,some_list)
4.使用Pandarallel库
Pandarallel可以将pandas操作与多个进程并行化同样,仅在您拥有大型数据集时使用。
from pandarallel import pandarallel from math import sin pandarallel.initialize() #ALLOWED def my_time_consunming_function(x): … df.parallel_apply(my_time_consuming_function,axis=1)
代码加密困难
1.代码混淆
通过一系列的转换,让代码逐渐不让人那么容易明白。
主要有以下几种手段:
移除注释和文档。没有这些说明,在一些关键逻辑上就没那么容易明白了。
改变缩进。完美的缩进看着才舒服,如果缩进忽长忽短,看着也一定闹心。
在tokens中间加入一定空格。这就和改变缩进的效果差不多。
重命名函数、类、变量。命名直接影响了可读性,乱七八糟的名字可是阅读理解的一大障碍。
在空白行插入无效代码。
方法:
(1).使用oxyry进行混淆
http://pyob.oxyry.com/是一个是一个在线混淆 Python 代码的网站,使用它可以方便地进行混淆。
左侧输入源码,点击[OBFUSCATE](模糊),即可在右侧看到模糊后的代码。
(2).使用pyobfuscate库进行混淆
pyobfuscate算是一个颇具年头的 Python 代码混淆库了,但却是“老当益壮”了。
2.使用py2exe
py2exe 是一款将 Python 脚本转换为 Windows 平台上的可执行文件的工具。其原理是将源码编译为.pyc文件,加之必要的依赖文件,一起打包成一个可执行文件。最终发行由 py2exe 打包出的二进制文件。
方法:
编写入口文件。示例中取名为hello.py:
print(‘hello world’)
编写setup.py
from distutils.core import setup import py2exe setup(console=[‘hello.py’]
生成可执行文件
python setup.py py2exe
生成可执行文件位于dist\hello.exe
3.使用Cpython
虽说Cython的主要目的是带来性能的提升,但是基于它的原理:将.py/.pyx编译为.c文件,再将.c文件编译为.so(Unix)或.pyd(Windows),其带来的另一个好处就是难以破解。
方法:
编写文件hello.pyx或hello.py:
def hello(): print(‘hello’)
编写setup.py:
from distutils.core import setup from Cython.Build import cythonize setup(name=’hello word app’ ext_modules=cythonize(‘hello.pyc’))
编译为.c,再进一步编译为.so或.pyd:
python3 setup.py build_ ext –inplace
执行python3 -c "from hello import hello;hello()"即可直接引用生成的二进制文件中的hello()函数。
4.发行.pyc文件
.pyc文件:二进制文件,无法看出源码内容
Python执行代码原理:代码—.pyc文件—解释执行.pyc文件中的内容,因此python也可以直接执行.pyc文件。
方法:
使用python标准库自带的compileall即可。
#遍历<path>目录下所有的.py文件,编译成.pyc文件 python -m compileall <path> #.pyc文件也可直接执行,下面两者效果相同 python scriptstudy.py python scriptstudy.pyc
.pyc加密是不安全的,目前有许多现成的反编译工具。所有各位看官看看就好。
关注指尖编程官方公众号,带你了解更多编程知识,走进编程世界!