Python编程Trick 笔记

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.csdn.net/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.csdn.net/qq_38150441/article/details/80488800
参考博文8 NumPy:数组常规操作合集
https://www.cnblogs.com/huchong/p/8503900.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值