广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python进阶用法3 【优化毫不起眼的
  • 201
分享到

python进阶用法3 【优化毫不起眼的

进阶python 2023-01-31 05:01:31 201人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇博客提及三个关于python循环的优化细节,如有其他一些优化的方案,欢迎留言分享~QWQ 在谈这个环节之前,我们先回顾一波何为生成器及何为yield 要理解yiled还需要理解生成器,而要理解生成器,首先需要理解迭代器。

这篇博客提及三个关于python循环优化细节,如有其他一些优化的方案,欢迎留言分享~QWQ

在谈这个环节之前,我们先回顾一波何为生成器及何为yield


要理解yiled还需要理解生成器,而要理解生成器,首先需要理解迭代器。

迭代器

所有你可以用在for...in...语句中的都是可迭代的:比如lists,strings,files…因为这些可迭代的对象你可以随意的读取所以非常方便易用,但是你必须把它们的值放到内存里,当它们有很多值时就会消耗太多的内存.

生成器

生成器也是迭代器的一种,但是你只能迭代它们一次.原因很简单,因为它们不是全部存在内存里,它们只在要调用的时候在内存里生成,下面看两个例子:

1、生成器

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...     print(i)
...
0
1
4
>>>

2、list列表

>>> listTest = [x*x for x in range(3)]
>>> for i in listTest:
...     print(i)
...
0
1
4

区别:

>>> print(listTest)
[0, 1, 4]
>>> print(mygenerator)
<generator object <genexpr> at 0x000001FAB703DE60>

生成器和迭代器的区别就是用()代替[],还有你不能用for i in mygenerator第二次调用生成器:首先计算0,然后会在内存里丢掉0去计算1,直到计算完4.

Yield

Yield的用法和关键字return差不多,下面的函数将会返回一个生成器:

>>> def createGenerator():
...     mylist = range(3)
...     for i in mylist:
...             yield i*i
...
>>> mygenerator = createGenerator()
>>> print(mygenerator)
<generator object createGenerator at 0x000001FAB703DE60>
>>>

要理解Yield你必须先理解当你调用函数的时候,函数里的代码并没有运行.函数仅仅返回生成器对象,这就是它最微妙的地方。


下面看两个例子:
1、仅仅分别产生generatorlist对象

import time
import sys


t1 = time.time()
arange = (i for i in range(2000000))
print("brange size:")
print(sys.getsizeof(arange))
t2 = time.time()
print("arange time:")
print(t2-t1)


t3 = time.time()
brange = [i for i in range(2000000)]
print("brange size:")
print(sys.getsizeof(brange))
t4 = time.time()
print("brange time:")
print(t4-t3)


# brange size:
# 88
# arange time:
# 0.0
# brange size:
# 17632632
# brange time:
# 0.12857437133789062

使用()得到的是一个generator对象,所需要的内存空间与列表的大小无关,所以效率会高一些。至于原理见上面的生成器原理部分。

2、供for循环使用

import time


t1 = time.time()
arange = (i for i in range(20000000))
for x in arange:
	pass

t2 = time.time()
print("arange time:")
print(t2-t1)


t3 = time.time()
brange = [i for i in range(20000000)]
for x in brange:
	pass

t4 = time.time()
print("brange time:")
print(t4-t3)

# arange time:
# 1.7372145652770996
# brange time:
# 1.8086597919464111

这里虽然说并没有快上多少,但不要忘记了,在时间更优的情况下,生成器generator内存空间占用更是完爆list,所以说,循环尽量用生成器!!!!

这个其实不必多说和解释,循环之外能做的事不要放在循环内,比如下面的优化基本可以快一倍:

import time

test = "123"
length_test = len(test)
t1 = time.time()
arange = (i for i in range(4000000))
for x in arange:
	ap = length_test

t2 = time.time()
print("arange time:")
print(t2-t1)


t3 = time.time()
brange = (i for i in range(4000000))
for x in brange:
	bp = len(test)

t4 = time.time()
print("brange time:")
print(t4-t3)

# arange time:
# 0.460693359375
# brange time:
# 0.8602120876312256

2333,这个你可能不相信,但请看例子:

import time


def while_1():
    t1 = time.time()
    n = 100000000
    while 1:
        n -= 1
        if n <= 0: break
    t2 = time.time()
    print("while1 time:")
    print(t2-t1)


def while_true():
    t3 = time.time()
    n = 100000000
    while True:
        n -= 1
        if n <= 0: break  
    t4 = time.time()
    print("while_true time:")
    print(t4-t3)


if __name__ == '__main__':
    while_1()
    while_true()

# while1 time:
# 5.369367837905884
# while_true time:
# 5.293442487716675

至于原理:
True是一个全局变量,而非关键字

--结束END--

本文标题: python进阶用法3 【优化毫不起眼的

本文链接: https://www.lsjlt.com/news/188908.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python进阶用法3 【优化毫不起眼的
    这篇博客提及三个关于python循环的优化细节,如有其他一些优化的方案,欢迎留言分享~QWQ 在谈这个环节之前,我们先回顾一波何为生成器及何为yield 要理解yiled还需要理解生成器,而要理解生成器,首先需要理解迭代器。...
    99+
    2023-01-31
    进阶 python
  • Python 编程中的算法:如何使用 API 进行优化?
    Python 是一种非常强大的编程语言,可以用于编写各种各样的应用程序和算法。在 Python 编程中,算法是非常重要的一部分,因为它们可以帮助我们解决各种各样的问题,例如数据分析、机器学习、图像处理等。 在 Python 编程中,有很多...
    99+
    2023-10-27
    编程算法 打包 api
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作