#

事情是这样的,我写的一个程序帧率上不去。

然后发现了一个疑似有问题的地方,如下

def around(x,y):
around_dict = {(i,j) for i in range(-1,2) for j in range(-1,2) }
return sum(list(map(ask,around_dict)))

这个函数每帧大概会运行几千次,字典around_dict似乎会被“反复生成”。如果是的话,那是十分低效的。不如提出来设成全局变量,一次创建反复使用。

所以写了下面的程序验证是否有这样的问题

import time
global_d = {(i,j):i+j for i in range(10) for j in range(10) } def f1():
d = {(i,j):i+j for i in range(10) for j in range(10) }
for x , y in d.items():
if x[0] + x[1] != y :
print("?") def f2():
for x , y in global_d.items():
if x[0] + x[1] != y :
print("?") def f3():
d = global_d.copy()
for x , y in d.items():
if x[0] + x[1] != y :
print("?") def timer(f):
t = time.time()
for i in range(10000):
f()
print('time-'+f.__name__+":"+str(time.time()-t)) for i in range(1,6):
print("第%s次"%i)
timer(f1)
timer(f2)
timer(f3)

运行结果

'''
第1次
time-f1:0.29221653938293457
time-f2:0.11273312568664551
time-f3:0.13164758682250977
第2次
time-f1:0.29621100425720215
time-f2:0.10870814323425293
time-f3:0.1356358528137207
第3次
time-f1:0.28024840354919434
time-f2:0.10671043395996094
time-f3:0.14561057090759277
第4次
time-f1:0.29421257972717285
time-f2:0.11868166923522949
time-f3:0.13364267349243164
第5次
time-f1:0.2872304916381836
time-f2:0.10571765899658203
time-f3:0.13763070106506348
'''

f1 是原样的

f2 是提出来,写成了全局变量

f3 是每次copy全局变量,然后再用

结论

1,“反复创建”的问题是存在的,

2,设定为全局变量可以“一次创建多次使用”  可以提高效率,但是不建议对字典进行修改

两个原因:

  a,函数内只能访问全局变量,不能修改,除非global语句事先声明

  b,函数多次使用的字典均为同一字典,修改后可能影响后边函数的运行(不像f1那样多次创建的字典之间“相互隔离”)

3,如果函数要求使用“相互独立”的字典,f3的“一次创建多次copy”优于f1的“多次创建”

【问题探索日志】python 函数优化的更多相关文章

  1. Python 关于Python函数参数传递方式的一点探索

    关于Python函数参数传递方式的一点探索 by:授客 QQ:1033553122 实践代码 #!/usr/bin/env python # -*- coding:utf-8 -*- __author ...

  2. Python性能优化(转)

    分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...

  3. 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!

    Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...

  4. Python函数讲解

    Python函数

  5. python函数 位置参数,关键字参数,可变参数优先级

    def fun(arg,args=1,*arg,**keywords): python 一共有这四类参数,第一类最常见,不用多说,第二类,关键字参数,python能通过关键字找到参数,python函数 ...

  6. python性能优化

      注意:本文除非特殊指明,”python“都是代表CPython,即C语言实现的标准python,且本文所讨论的是版本为2.7的CPython. python为什么性能差: 当我们提到一门编程语言的 ...

  7. Python内存优化

    实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...

  8. MySQL慢日志功能分析及优化增强

    本文由  网易云发布. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据.本 ...

  9. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

随机推荐

  1. 关于ios7 以上版本 view被导航栏遮挡的问题 解决方案

    self.edgesForExtendedLayout = UIRectEdgeNone; 如果导航栏是默认带磨砂透明效果的,使用了edgesForExtendedLayout可能会出现导航栏变不透明 ...

  2. 用jQuery获取到一个类名获取到的是一个数组 ,如果对数组中的每个进行相应的操作可以这样进行

    $(".userImg").each(function(){ $(this).click(function(){ var imgid = $(this).attr("id ...

  3. POJ3417(树上差分)

    会卡vector. ; int n, m, Ans; ], to[maxn * ], tot; int vis[maxn], f[maxn]; int d[maxn], sum[maxn]; vect ...

  4. D Tree HDU - 4812

    https://vjudge.net/problem/HDU-4812 点分就没一道不卡常的? 卡常记录: 1.求逆元忘开longlong 2.把solve中分离各个子树的方法,由“一开始全部加入,处 ...

  5. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  6. sql基础语法-创建表和约束

    创建数据库表 USE SQL2016 IF OBJECT_ID('dbo.Employees','U') IS NOT NULL DROP TABLE dbo.Employees; Create TA ...

  7. AJPFX总结匿名类及其使用

    匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义.内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员也可以在一个语句块的内部定义还可以在表达式内部匿名定义匿名类与其他类的不同就 ...

  8. Ubuntu16下查看CPU、内存和磁盘相关信息

    1.内存 查看内存#free -m total used free shared buff/cache available Mem: Swap: 2.CPU 查看逻辑cpu个数: #cat /proc ...

  9. fsck和badlocks

    fsck可以检查好几种不同的文件系统,fsck只是一个中和程序而已,个别的文件系统检查程序都在/sbin中,可以使用ls -l /sbin/fsck* -A 按照/etc/fstab的内容,将所有的设 ...

  10. 回顾PMP考试

    2014年9月20日,于我来说绝对可以说是一个重要的日子.经过考场里4个多小时(4个小时正式的时间+前面的签到以及后面的survey等)的鏖战,出去之后才发现北京外国语大学的楼宇是如此的漂亮,阳光也是 ...