Python代码编写优化

在导入方式及 代码运行访问 命名空间中的变量时,先在本地变量寻找 再到全局变量寻找的优化

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import math
import timeit
from math import sin


def tight_loop_very_slow(iterations):
    """
    每次循环 要先找全局变量中的math模块,再去 模块中找 sin方法,极慢
    """
    result = 0
    for i in range(iterations):
        result += math.sin(i)


def tight_loop_slow(iterations):
    """
    每次循环 要去 全局变量中找 sin方法,较慢
    """
    result = 0
    for i in range(iterations):
        result += sin(i)


def tight_loop_fast(iterations):
    """
    每次循环在本地变量中找到 sin方法,较快
    """
    result = 0
    local_sin = sin
    for i in range(iterations):
        result += local_sin(i)


if __name__ == '__main__':
    x = timeit.repeat(stmt="tight_loop_very_slow(10000000)", number=2, globals=globals())
    print(x)
    x = timeit.repeat(stmt="tight_loop_slow(10000000)", number=2, globals=globals())
    print(x)
    x = timeit.repeat(stmt="tight_loop_fast(10000000)", number=2, globals=globals())
    print(x)

代码运行时间分析 结果如下:

总结:

  • 推荐使用 如上示例的 tight_loop_fast() 函数;
  • 在导入模块时,最好 使用 from xxx import xxx 导入具体的方法,而不是 粗略的导入一个模块;
  • 在for循环内部(特别是 for循环次数达到10万级别时)需要 调用其他模块方法时, 可以将 其他模块方法 在本函数中先 赋值一次;这样 在本地变量中就能找到对应方法;

尽量使用 迭代器 代替list

# -*- coding: utf-8 -*-
"""
(C) rgc
All rights reserved
create time '2021/1/21 18:25'

Usage:

"""
from memory_profiler import profile


@profile
def use_list():
    """
    使用list,内存需要存储所有符合条件的数据,再进行 长度判断
    :return:
    """
    print(len([1 for n in range(1000000) if n % 3 == 0]))


@profile
def use_generator():
    """
    使用生成器,每次只 生成一个数据给 sum使用,这样内存执行存储一个数据即可
    :return:
    """
    print(sum((1 for n in range(1000000) if n % 3 == 0)))


if __name__ == '__main__':
    use_list()
    use_generator()

内存分析 运行结果如下: 

总结:

  • 在循环数量较大时(万级别以上), 且满足需求前提下,尽量使用 生成器 代替list, 用来减少内存消耗;
  • 在时间消耗上, 两者差不多;
  • python的 itertools(迭代器模块) 里有很多 能用到的 迭代器方法,目的为了高效且节约内存;

尽量进行矢量计算

就是cpu尽量使用L1/L2 的缓存中的数据计算,而不用再从 内存中取数据; cpu从内存中取数据 是非常浪费时间的行为; 使用numpy的矢量计算可以尽量避免此行为

尽量使用 就地操作 如  a+=1  而不要用a=a+1; 也就是 内存ID尽量不要换;

如下内容引用自 <<python高性能编程>>

Numba 可能提供了快速的性能提升,而几乎不需要什么工作量,但是它也会有在
你的代码上可能不会工作得很好的限制。这也是一个相对年轻的项目。
Cython 可能为最广泛的问题集提供了最好的结果,但是它的确需要更多的工作量
和交额外的“支持税”,这要归因于它混合使用了 Python 和 C 注解。
如果你不使用 numpy 或其他难以移植的 C 扩展,PyPy 是一个强力的选择。
如果你想要编译成 C 并且不使用 numpy 或其他外部库,Shed Skin 可能是有用的。
如果你正在部署一个生产工具,那么你可能想要坚持使用理解良好的工具—
Cython 应该是你的主要选择,你可能想要查阅在 12.2 节。PyPy 也被用于产品设
置(看看 12.5 节)。
如果你工作于少量的数值处理需求,注意 Cython 的缓存接口接受 arrary.array
矩阵——这是一个把一块数据传给 Cython 的简单方法,可用来做快速的数值处理
而不用添加 numpy 作为项目依赖。
整体而言,Pythran 和 Numba 是年轻但是很有前景的项目,而 Cython 十分成熟。
PyPy 到现在被视为相对成熟,并且应该一定要有长期的过程来评估。

参考书籍:

<<python高性能编程>>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电力负荷预测是指通过对历史电力负荷数据的分析和建模,来预测未来一段时间内的电力负荷情况。下面是一个简单的电力负荷预测的Python代码编写示例: ```python # 导入所需的库 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error # 读取电力负荷数据 data = pd.read_csv('electricity_load.csv') # 提取特征和标签 X = data[['特征1', '特征2', ...]] # 根据实际情况选择征列 y = data['负荷'] # 划分训练和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 创建线性回归模型 model = LinearRegression() # 拟合模型 model.fit(X_train, y_train) # 预测测试集 y_pred = model.predict(X_test) # 计算均方误差 mse = mean_squared_error(y_test, y_pred) print('均方误差:', mse) # 相关问题: 1. 什么是电力负荷预测? 2. 有哪些常用的电力负荷预测方法? 3. 如何评估电力负荷预测模型的准确性? 4. 有没有其他的回归模型可以用于电力负荷预测? 5. 如何处理电力负荷数据中的缺失值和异常值? 6. 电力负荷预测在实际应用中有哪些挑战? 7. 如何优化电力负荷预测模型的性能? 8. 电力负荷预测可以应用于哪些领域? 9. 有没有开源的电力负荷预测库或工具推荐? 10. 电力负荷预测中常用的特征有哪些? 11. 如何选择合适的特征进行电力负荷预测? 12. 电力负荷预测中常用的时间序列分析方法有哪些? 13. 如何处理电力负荷数据中的季节性和周期性变化? 14. 电力负荷预测中如何考虑天气因素的影响? 15. 有没有其他的机器学习算法可以用于电力负荷预测? 16. 如何应对电力负荷预测中的数据不平衡问题? 17. 电力负荷预测中如何处理多个相关变量之间的关系? 18. 如何选择合适的模型评估指标来评估电力负荷预测模型的性能? 19. 电力负荷预测中如何处理数据的时序性? 20. 有没有其他的时间序列预测方法可以用于电力负荷预测? ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值