python怎么写⼊⽂件慢_当你认为Python程序慢时!⼏个⽅法
你使⽤了吗!
计时与性能分析
在开始优化之前,我们⾸先需要到代码的哪⼀部分真正拖慢了整个程序。有时程序性能的瓶颈显⽽易见,但当你不知道瓶颈在何处时,这⾥有⼀些帮助到性能瓶颈的办法:
注:下列程序⽤作演⽰⽬的,该程序计算 e 的 X 次⽅(摘⾃ Python ⽂档):
最懒惰的「性能分析」
⾸先,最简单但说实话也很懒的⽅法——使⽤ Unix 的 time 命令:
如果你只想给整个程序计时,这个命令即可完成⽬的,但通常是不够的……
最细致的性能分析
另⼀个极端是 cProfile,它提供了「太多」的信息:
这⾥,我们结合 cProfile 模块和 time 参数运⾏测试脚本,使输出⾏按照内部时间(cumtime)排序。这给我们提供了⼤量信息,上⾯你看到的⾏只是实际输出的 10%。从输出结果我们可以看到 exp 函数是罪魁祸⾸(惊不惊喜,意不意外),现在我们可以更加专注于计时和性能分析了……
计时专⽤函数
现在我们知道了需要关注哪⾥,那么我们可能只想要给运⾏缓慢的函数计时⽽不去管代码的其他部分。我们可以使⽤⼀个简单的装饰器来做到这点:
接着,将该装饰器按如下⽅式应⽤在待测函数上:
得到如下输出:
此时我们需要考虑想要测量哪⼀类时间。time 库提供了 time.perf_counter 和 time.process_time 两种时间。其区别在
于,perf_counter 返回绝对值,其中包括了 Python 程序并不在运⾏的时间,因此它可能受到机器负载的影响。⽽ process_time 只返回⽤户时间(除去了系统时间),也就是只有进程运⾏时间。
让程序更快
现在到了真正有趣的部分了,让 Python 程序跑得更快!我不会告诉你⼀些奇技淫巧或代码段来神奇地解决程序的性能问题,⽽更多是关于通⽤的想法和策略。使⽤这些策略,可以对程序性能产⽣巨⼤的影响,有时甚⾄可以带来⾼达 30% 的提速。
使⽤内置的数据类型
这⼀点⾮常明显。内置的数据类型⾮常快,尤其相⽐于树或链表等⾃定义类型⽽⾔。这主要是因为内置数据类型使⽤ C 语⾔实现,使⽤Python 实现的代码在运⾏速度上和它们没法⽐。
使⽤ lru_cache 实现缓存/记忆
我在之前的博客中介绍过这⼀技巧,但我认为它值得⽤⼀个简单例⼦再次进⾏说明:
上⾯的函数使⽤ time.sleep 模拟了繁重的计算过程。当我们第⼀次使⽤参数 1 调⽤函数时,它等待了 2 秒钟后返回了结果。当再次调⽤时,结果已经被缓存起来,所以它跳过了函数体,直接返回结果。
使⽤局部变量
这和每个作⽤域中变量的查速度有关。我之所以说「每个作⽤域」,是因为这不仅仅关乎局部变量或全局变量。事实上,就连函数中的局部变量、类级别的属性和全局导⼊函数这三者的查速度都会
有区别。函数中的局部变量最快,类级别属性(如 self.name)慢⼀些,全局导⼊函数(如 time.time)最慢。
你可以通过这种看似没有必要的代码组织⽅式来提⾼效率:
使⽤函数
这也许有些反直觉,因为调⽤函数会让更多的东西⼊栈,进⽽在函数返回时为程序带来负担,但这其实和之前的策略相关。如果你只是把所有代码扔进⼀个⽂件⽽没有把它们放进函数,那么它会因为众多的全局变量⽽变慢。因此,你可以通过将所有代码封装在 main 函数中并调⽤它来实现加速,如下所⽰:
不要访问属性
另⼀个可能让程序变慢的东西是⽤来访问对象属性的点运算符(.)。这个运算符会引起程序使⽤__getattribute__进⾏字典查,进⽽为程序带来不必要的开销。那么,我们怎么避免(或者限制)使⽤它呢?
当⼼字符串
python怎么读文件夹下的文件夹当在循环中使⽤取模运算符(%s)或 .format() 时,字符串操作会变得很慢。有没有更好的选择呢?根据 Raymond Hettinger 近期发布的推⽂,我们只需要使⽤ f-string 即可,它可读性更强,代码更加紧凑,并且速度更快!基于这⼀观点,如下从快到慢列出了你可以使⽤的⼀系列⽅法:
⽣成器本质上并不会更快,因为它们的⽬的是惰性计算,以节省内存⽽⾮节省时间。然⽽,节省的内存会让程序运⾏更快。为什么呢?如果你有⼀个⼤型数据集,并且你没有使⽤⽣成器(迭代器),那么数据可能造成 CPU 的 L1 缓存溢出,进⽽导致访存速度显著变慢。
总结
优化的第⼀要义就是「不要去做」。但如果你必须要做,我希望这些⼩技巧可以帮助到你。然⽽,优化代码时⼀定要谨慎,因为该操作可能最终造成代码可读性变差、可维护性变差,这些弊端可能超过代码优化所带来的好处。
需要源代码或者了解更多的点击这⾥下载

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。