Python编程建议
因为已经有很多大佬做过总结,所以这里只做笔记并附上链接。
1 分享8点超级有用的Python编程建议
1.1 项目文件事先做好归档
(转载自 https://mp.weixin.qq.com/s/eOeXA0ctErvd2mmEexZcBA)
1.2 永远不要手动修改源数据并且做好备份
1.3 做好路径的正确配置
1.4 代码必要的地方做好备注与说明
1.5 加速你的Python循环代码
1.6 可视化你的循环代码进度
1.7 使用高效的异常捕获工具
import pysnooper
@pysnooper.snoop('./file.log')
def number_to_bits(number):
if number:
bits = []
while number:
number, remainder = divmod(number, 2)
bits.insert(0, remainder)
return bits
else:
return [0]
number_to_bits(6)
1.8 要多考虑代码健壮性
2 二十四式加速你的Python
2.1 分析代码运行时间
2.1.1 测算代码运行时间
2.1.2 测算代码多次运行平均时间
出自另一篇博客——计算代码的运行时间
from timeit import Timer
'''
- 实例化一个空列表,然后将0-n范围的数据添加到列表中。(四种方式)
- timeit模块:该模块可以用来测试一段python代码的执行速度/时长。
- Timer类:该类是timeit模块中专门用于测量python代码的执行速度/时长的。原型为:class timeit.Timer(stmt='pass',setup='pass')。
- stmt参数:表示即将进行测试的代码块语句。
- setup:运行代码块语句时所需要的设置。
- timeit函数:timeit.Timer.timeit(number=100000),该函数返回代码块语句执行number次的平均耗时。
'''
def test01():
alist = []
for i in range(1000):
alist = alist + [i]
def test02():
alist = []
for i in range(1000):
alist.append(i)
def test03():
alist = [i for i in range(1000)]
def test04():
alist = list(range(1000))
if __name__ == '__main__':
t1 = Timer('test01()','from __main__ import test01')
print(t1.timeit(number=1000))
t2 = Timer('test02()','from __main__ import test02')
print(t2.timeit(number=1000))
t3 = Timer('test03()','from __main__ import test03')
print(t3.timeit(number=1000))
t4 = Timer('test04()','from __main__ import test04')
print(t4.timeit(number=1000))
2.2 加速查找
2.2.1 用set替换list
2.2.2 用dict替换两个list
2.3 加速循环
2.3.1 优先使用for而非while
2.3.2 避免循环体重复计算
循环体里面可以直接用内置函数就不要写表达式。
2.4 加速函数
2.4.1 用循环代替递归
2.4.2 用缓存机制加速递归函数
2.4.3 用numba加速Python函数
在使用numpy数组做大量科学计算和使用for循环时可使用,具体参考另一博客——numba,让python速度提升百倍。
import numpy as np
import numba
from numba import jit
@jit(nopython=True) # jit,numba装饰器中的一种
def go_fast(a): # 首次调用时,函数被编译为机器代码
trace = 0
# 假设输入变量是numpy数组
for i in range(a.shape[0]): # Numba 擅长处理循环
trace += np.tanh(a[i, i])
return a + trace
2.5 加速函数使用标准库函数进行加速
2.5.1 使用collections.Counter加速计数
2.5.2 使用collections.ChainMap加速字典合并
2.6 使用numpy向量化加速
推荐博文==》NumPy:数组常规操作合集
2.6.1 用np.array代替list
2.6.2 用np.ufunc代替math.func
2.6.3 用np.where代替if
2.7 加速你的Pandas
2.7.1 用np.ufunc代替applymap
2.7.2 用csv读写代替excel读写
2.7.3 用pandas多进程工具pandarallel(暂不支持windows)
出自知乎专栏——傻瓜式pandas多进程 pandarallel
import pandas as pd
import numpy as np
from pandarallel import pandarallel
pandarallel.initialize(nb_workers=4)
# ALLOWED
def func(x):
return x**3
df=pd.DataFrame(np.random.rand(1000,1000))
### 就是这么easy的调用方式
df.parallel_apply(func, axis=1)
2.8 用Dask进行加速
2.8.1 用dask加速dataframe
2.8.2 用dask.delayed进行加速
2.9 用多线程多进程加速
2.9.1 用多线程加速IO密集型任务
2.9.2 用多进程加速CPU密集型任务
3 编写高质量python代码的59个有效方法
这是一本书,网上轻易可找到资源,我就不放链接了(不过可以放个其他人的读书笔记(系列))。
4 数据处理注意事项
4.1 数据读取
在处理csv文件时,尽量使用np.loadtext()方法处理数据,使用pd.read_table()处理完数据转为ndarray数据是会有精度损失。
如:原数据为0.08382081754672763,
pd.read_table()处理完后为0.0838208175467276,
np.loadtext()处理完为0.08382081754672763。
4.2 数据处理
在对大规模numpy数组进行拼接时,numpy.append()和numpy.concatenate()方法优先考虑concatenate(参考博文7有进行测试)
注意:
numpy的数组没有动态改变大小的功能,numpy.append()函数每次都会重新分配整个数组,并把原来的数组复制到新数组中。
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([7,8,9])
c=np.concatenate((a,b.reshape(-1,3)),axis=0)#维度不同需要规范
c=np.append(a,b).reshape(-1,3)
后面如果还有值得分享的再更!!!
感谢及参考博文
部分内容参考以下链接,这里表示感谢 Thanks♪(・ω・)ノ
参考博文1 分享8点超级有用的Python编程建议
https://mp.weixin.qq.com/s/eOeXA0ctErvd2mmEexZcBA
参考博文2 24式加速你的Python
https://mp.weixin.qq.com/s/8bWm4NjHAam-fIeC4a29cA
参考博文3 计算代码的运行时间
https://blog.youkuaiyun.com/weixin_41629197/article/details/90266761
参考博文4 numba,让python速度提升百倍
https://www.cnblogs.com/zhuwjwh/p/11401215.html
参考博文5 numba,让python速度提升百倍
https://zhuanlan.zhihu.com/p/65147779
参考博文6 读书笔记(系列): 编写高质量python代码的59个有效方法
https://www.jianshu.com/p/15a6050220e6
参考博文7 numpy数组拼接方法介绍(concatenate)
https://blog.youkuaiyun.com/qq_38150441/article/details/80488800
参考博文8 NumPy:数组常规操作合集
https://www.cnblogs.com/huchong/p/8503900.html