搜索

首页  >  问答  >  正文

python - 怎么判断函数或方法多次使用是否需要定义临时变量?

自学一直有一个困扰(因为教程里不太会提及这种问题)
比如一些简单的函数或方法,如 len()isdigit()
多次使用的情况下

string = 'something'
if len(string) == 1:
   pass
elif len(string) == 2:
   pass

是否需要定义一个临时的变量

string = 'something'
length = len(string)
if len(length) == 1:
   pass
elif len(length) == 2:
   pass

这样变量多了一个,但是函数少计算一次
哪一种益处更大呢?
-是所有此类情况都用临时变量呢?
-还是具体函数具体分析,简单的不需要临时变量?
从资源合理利用的角度,怎么权衡这两种方案

PHP中文网PHP中文网2812 天前406

全部回复(4)我来回复

  • 怪我咯

    怪我咯2017-04-17 17:53:16

    先讲结论:

    对于这个问题的情境,我支持不另外定义新的变数


    我先简单从两个方面回答你的问题


    首先,当效率不是当前程式的关键核心时,以追求 可读性 为最高原则

    怎么说呢?

    1. 有些程式和代码处理的问题本身就不是追求速度的议题,比如说简单的寄帐程式跟科学计算比起来,特意追求执行速度的最佳化不是很有意义,就算是追求效率的程式,也不见得你现在focus 的代码就是影响效率的关键处(需要作profiling 才能真正确定,过早最佳化不是很好)。重点是,若非出现效能问题且你已经确定是该代码段造成,否则完全不用作资源或效能上的过度考虑,尤其现在机器的空间和运算速度那么进步的状况下,一些函数呼叫根本不算什么,否则oop 和一些抽象化的技巧早就不能用了。

    2. 所以追求可读性是一般情况下比较好的目标,当然这部分就很看状况了,比方说Refactoring 这本书里面就有提到Replace Temp with Query 的手法,因为区域变数可能会使代码难以被提炼( extract )。但其实也不尽然,有时候过长的 Query 式也会让代码难以阅读,总之这部份可以有这部分的考量跟权宜。


    第二个部分可以来分析一下效率,以len 而言,我会选择不另外定义一个变数,因为Python 对于其内建的资料结构,len函数是会直接从对应的C-Object 中回传资料的长度属性,所以这部分是非常快的,我的意思是,Python 对于自己内建的资料,本身就保存着长度的资讯,使用len 不会造成额外的计算或是层叠的调用,所以完全不必考虑效率问题。 len 而言,我會選擇不另外定義一個變數,因為 Python 對於其內建的資料結構,len 函數是會直接從對應的 C-Object 中回傳資料的長度屬性,所以這部分是非常快的,我的意思是,Python 對於自己內建的資料,本身就保存著長度的資訊,使用 len 不會造成額外的計算或是層疊的調用,所以完全不必考慮效率問題。

    而且 len

    而且 len 的阅读性很高,函数长度也很短,定义一个新的变数不是很必要。

    P.S. 若我的理解有误,请不吝指正,谢谢🎜

    回复
    0
  • 高洛峰

    高洛峰2017-04-17 17:53:16

    从性能考虑,这种情况确实需要临时变量,建议养成良好习惯,多用临时变量并无害处

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 17:53:16

    string = 'something'
    length = len(string)
    if length == 1:
       pass
    elif length == 2:
       pass

    首先更正一下程序,在第二版中,len()用一次就可以了,临时变量也好,也要取个有意义的名字。
    不知道你用时间复杂度有没有概念,某些算法一次的时间复杂度是O(N),也就是说,你的字符串有n个元素,你的程序就要通过n步才能达到目标,如果你之后还需要m次用到这算法的话,那么你的程序的时间复杂度最少也要n*m步才能完成。len()用一次就可以了,临时变量也好,也要取个有意义的名字。
    不知道你用时间复杂度有没有概念,某些算法一次的时间复杂度是O(N),也就是说,你的字符串有n个元素,你的程序就要通过n步才能达到目标,如果你之后还需要m次用到这算法的话,那么你的程序的时间复杂度最少也要n*m步才能完成。

    如果你用一个临时变量来记录这个算法,之后通过查值只会用O(1)的时间复杂度,也就是说,你的程序的总复杂度从O(n*m)减少到O(n+m),如果n <= m

    如果你用一个临时变量来记录这个算法,之后通过查值只会用O(1)的时间复杂度,也就是说,你的程序的总复杂度从O(n*m)减少到O(n+m),如果n <= m的话,你的程序时间复杂度就从本来的O(N^2)减少到O(N)了。

    我不太同意多用临时变量的说法,如果这临时变量在程序出现频率<3的话,那么这个临时量很可能是不需要的,太多临时变量会加大程序重构的难度的,是否用临时变量主要基于以下几种考虑:
    1. 是否大幅度减少了程序的时间复杂度?
    2. 是否让别人更容易理解你的意图?
    3. 是否能把代码看上去更简洁?
    🎜

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:53:16

    这个问题一般都是因地制宜的,如果只有两个判断没有必要定义变量了,毕竟变量多了不好维护。单就你这个长度而言,如果多个判断的话,可以用switch case,直接把len()方法作为参数传进来,并把概率大的选项放在首位。我没学过Python,不过我感觉switch case这个方法应该有。从我的经验来看,尽量少定义临时变量,时间积累长了,变量管理是个很难的事。当然有些地方必须要变量,比如for循环的时候,定义一个临时变量存数组长度会使性能提高一些。总之一切还是从实际出发,当临时变量能大大提升当前代码的可读性和维护性时,就需要。否则,就不定义。

    回复
    0
  • 取消回复