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

  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/ansver/p/10854493.html
Copyright © 2011-2022 走看看