zoukankan      html  css  js  c++  java
  • 【问题探索日志】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)
        
    View Code

    运行结果

    '''
    第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的“多次创建”

  • 相关阅读:
    FastAPI 学习之路(十九)处理错误
    FastAPI 学习之路(二十六)全局依赖项
    FastAPI 学习之路(二十)接口文档配置相关
    FastAPI 学习之路(二十二)依赖项
    FastAPI 学习之路(二十一)请求体 更新数据
    FastAPI 学习之路(二十四)子依赖项
    Never worry about ASP.NET AJAX’s .d again
    Java C格式输入利用printf函数
    Oracle正则表达式函数
    javascript 事件驱动编程【转(原文为“事件驱动的javascript”)】
  • 原文地址:https://www.cnblogs.com/ansver/p/10854493.html
Copyright © 2011-2022 走看看