成都网站建设设计

将想法与焦点和您一起共享

python函数jump,python函数局部变量和全局变量同名

python 算法之青蛙跳出井口

一只青蛙在井底,每天白天向上爬3米,夜晚又滑下去2米,

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、虚拟空间、营销软件、网站建设、五莲网站维护、网站推广。

井深10米青蛙要爬多少天才能爬到井口?

i表示天数

a青蛙高度

流程图

a=0

for i in range(1,20):

a+=3

if a=10:

break

a-=2

a=0

i=0

while True:

i+=1

a+=3

if a=10:

break

a-=2

def jump(a, i):

a+=3

if a=10:

print(i)

return

a-=2

i+=1

jump(a,i)

a=0

i=1

jump(a, i)

python 列表推导 为什么快

首先肯定 map 和列表推导效率确实会比循环的高,

先说列表推导,下边是我在 ipython 里的测试结果(测试环境 Python 2.7.10):

long_list = range(1000)

a = []

%timeit for i in long_list: a.append(i+1)

10000 loops, best of 3: 100 µs per loop

%timeit [i+1 for i in long_list]

10000 loops, best of 3: 43.3 µs per loop

可以看出列表推导还是要快过 for 循环的。

那为什么列表推导会快呢?我们直接调用 python 的 dis 模块去看看他的字节码:

这个是列表推导那一行代码的字节码:

0 BUILD_LIST 0

3 LOAD_GLOBAL 0 (long_list)

6 GET_ITER

7 FOR_ITER 16 (to 26)

10 STORE_FAST 0 (i)

13 LOAD_FAST 0 (i)

16 LOAD_CONST 1 (1)

19 BINARY_ADD

20 LIST_APPEND 2

23 JUMP_ABSOLUTE 7

...

这个是 for 循环那一行的字节码:

6 SETUP_LOOP 31 (to 40)

9 LOAD_GLOBAL 0 (long_list)

12 GET_ITER

13 FOR_ITER 23 (to 39)

16 STORE_FAST 1 (i)

19 LOAD_FAST 0 (a)

22 LOAD_ATTR 1 (append)

25 LOAD_FAST 1 (i)

28 LOAD_CONST 1 (1)

31 BINARY_ADD

32 CALL_FUNCTION 1

35 POP_TOP

36 JUMP_ABSOLUTE 13

...

对比一下不难发现其实列表推导和 for 循环的过程几乎是一样的,除了如何append。所以你要说他是语法糖也不是不行……

列表推导中直接使用了‘LIST_APPEND’这个字节码来实现 append 功能,效率相当的高。而在 for 循环中每次循环都要先载入

append 这个属性然后再 ‘CALL_FUNCTION’一下。这样势必就会慢了很多。为了验证我们的猜想,我们把 append

这个函数存到局部变量里去:

a = []

invoke = a.append

%timeit for i in long_list: invoke(i+1)

10000 loops, best of 3: 67.2 µs per loop

发现没有比前一个版本的 for 循环快了接近40%,剩下的多出来20多 µs 的开销自然就是‘CALL_FUNCTION’的开销咯 ╮(╯_╰)╭。

相信到这里你应该明白了为什么列表推导要比 for 循环快吧,秘诀就在这个‘LIST_APPEND’这个字节码上,相当于你直接调用了 C 语言版本的函数(不严谨)而且越过了一些中间步骤。

接下来简单说说 map 的事情,直接使用 map 一般来说是要比循环快的,但有的时候情况会比较诡异,例如:

%timeit for i in long_list: a.append(i+1)

10000 loops, best of 3: 100 µs per loop

%timeit map(lambda x: x+1, long_list)

10000 loops, best of 3: 109 µs per loop

别急,我们把 map 的写法改成这样:

int_object = 1

%timeit map(int_object.__add__, long_list)

10000 loops, best of 3: 41.6 µs per loop

于是神奇的事情出现了!基本上和列表推导一样快!(⊙o⊙)

这个主要是因为 lambda

表达式生成的函数是 Python 的,而直接用+运算符或者__add__方法调用的是 C 版本的。你要是把列表推导里边的+换成 lambda

表达式两者的速度差不多,map 一般来说还要快上一点点。本质上来说 map 调用了底层的 C 函数所以速度自然是快的。粗暴的总结一下就是不用

lambda 的时候 map 要快一些

python递归如何达到某一条件停止并返回当前值

Python break语句,就像在C语言中,打破了最小封闭for或while循环。

break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。

break语句用在while和for循环中。

如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。


文章名称:python函数jump,python函数局部变量和全局变量同名
文章起源:http://chengdu.cdxwcx.cn/article/hcgspg.html