【问题探索日志】python 函数优化
#
事情是这样的,我写的一个程序帧率上不去。
然后发现了一个疑似有问题的地方,如下
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 函数优化的更多相关文章
- Python 关于Python函数参数传递方式的一点探索
关于Python函数参数传递方式的一点探索 by:授客 QQ:1033553122 实践代码 #!/usr/bin/env python # -*- coding:utf-8 -*- __author ...
- Python性能优化(转)
分成两部分:代码优化和工具优化 原文:http://my.oschina.net/xianggao/blog/102600 阅读 Zen of Python,在Python解析器中输入 import ...
- 一文搞懂Python函数(匿名函数、嵌套函数、闭包、装饰器)!
Python函数定义.匿名函数.嵌套函数.闭包.装饰器 目录 Python函数定义.匿名函数.嵌套函数.闭包.装饰器 函数核心理解 1. 函数定义 2. 嵌套函数 2.1 作用 2.2 函数变量作用域 ...
- Python函数讲解
Python函数
- python函数 位置参数,关键字参数,可变参数优先级
def fun(arg,args=1,*arg,**keywords): python 一共有这四类参数,第一类最常见,不用多说,第二类,关键字参数,python能通过关键字找到参数,python函数 ...
- python性能优化
注意:本文除非特殊指明,”python“都是代表CPython,即C语言实现的标准python,且本文所讨论的是版本为2.7的CPython. python为什么性能差: 当我们提到一门编程语言的 ...
- Python内存优化
实际项目中,pythoner更加关注的是Python的性能问题,之前也写过一篇文章<Python性能优化>介绍Python性能优化的一些方法.而本文,关注的是Python的内存优化,一般说 ...
- MySQL慢日志功能分析及优化增强
本文由 网易云发布. MySQL慢日志(slow log)是MySQL DBA及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等SQL语句,为进行系统调优提供依据.本 ...
- python 函数名 、闭包 装饰器 day13
1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...
随机推荐
- Luogu P1850换教室【期望dp】By cellur925
题目传送门 首先这个题我们一看它就是和概率期望有关,而大多数时候在OI中遇到他们时,都是与dp相关的. \(Vergil\)学长表示,作为\(NOIp2016\)的当事人,他们考前奶联赛一定不会考概率 ...
- js锚点
锚点,在地址栏http://localhost:8000/Demo1/js锚点.html#a 跳转到指定位置可以是 <a>标签的name 也可以是标签的id. 曾经看到有锚点的页面,但 ...
- MySql | 常用操作总结
创建数据库: CREATE DATABASE 数据库名; 删除数据库名: drop database <数据库名>; 选择数据库: use 数据库名; 创建数据表: CREATE TABL ...
- django相关命令
1 安装django pip3 install django 2 django-admin命令 django-admin startproject mysite #创建一个项目 3 manage.py ...
- BFS HDOJ 1242 Rescue
题目传送门 题意:从r走到a,遇到x多走一步,问最小走到a的步数 分析:因为r有多个,反过来想从a走到某个r的最小步数,简单的BFS.我对这题有特殊的感情,去年刚来集训队时肉鸽推荐了这题,当时什么都不 ...
- pscp多线程传输文件
前面说过pscp不支持多线程,所以在此特地实现了一个 程序分三个部分: 1.初始化各种参数,涉及getopt函数的使用 2.重新定义scp,实现传递IP然后远程拷贝 3.启动多线程调用scp,涉及多线 ...
- 洛谷P2770 航空路线问题(费用流)
题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...
- QQ面板拖拽(慕课网DOM事件探秘)(上)
QQ面板拖拽,效果如图 JavaScript代码如下: function getByClass(clsName, parent) { var oParent = parent ? document.g ...
- SQL中的笛卡儿积问题和多表连接操作
(使用scott用户) SELECT * FROM scott.dept;--4SELECT * FROM scott.emp;--14 /**笛卡尔积内连接(等值连接)外连接(非等值连接)自连接*/ ...
- ASP.NET Web API FilterAttribute假想
偶然的测试发现API FilterAttribute没用引用只会初始化一次 比如: 如果是 Global Action Filter, 则全局只会初始化一次 针对于不同的Controller级别的Ac ...