“if”和“if not”之间的性能或风格差异?

时间:2012-10-01 19:55:01

标签: python performance if-statement coding-style

这两种撰写if语句的方式之间是否存在性能差异或样式偏好?基本上是一样的,1条件只会遇到一次,而其他条件会每隔一段时间就满足一次。如果只满足一次的条件是第一次还是第二次?性能明智吗?如果表现相同,我更喜欢第一种方式。

data = range[0,1023]
length = len(data)
max_chunk = 10

for offset in xrange(0,length,max_chunk):
    chunk = min(max_chunk,length-offset)
    if chunk < max_chunk:
        write_data(data[offset:])
    else:
        write_data(data[offset:offset+max_chunk])

VS

data = range[0,1023]
length = len(data)
max_chunk = 10

for offset in xrange(0,length,max_chunk):
    chunk = min(max_chunk,length-offset)
    if not chunk < max_chunk:
        write_data(data[offset:offset+max_chunk])
    else:
        write_data(data[offset:])

7 个答案:

答案 0 :(得分:9)

在您的示例中,根本不需要if

data = range[0,1023]
length = len(data)
max_chunk = 10

for offset in xrange(0,length,max_chunk):
    write_data(data[offset:offset+max_chunk]) # It works correctly

我认为这是您案件中最有效的方式。

答案 1 :(得分:7)

好吧,试试吧:

x = np.random.rand(100)

def f(x):
    z = 0
    for i in x:
        if i < 0.5:
            z += 1
        else:
            z += 0
    return z

def g(x):
    z = 0
    for i in x:
        if not (i < 0.5):
            z += 0
        else:
            z += 1
    return z

我们得到:

%timeit f(x)
10000 loops, best of 3: 141 us per loop
%timeit g(x)
10000 loops, best of 3: 140 us per loop

不,这里没有太多差异。即使x值较大,差异也很小。

我必须说我有点惊讶,我预计直接版本(f)的效率会比not版本g略高一些)。

道德:随心所欲。

答案 2 :(得分:5)

我认为READABILITY比性能优势更重要,尽管我认为没有任何差异。

所以使用第一种方式,因为它更容易理解。

答案 3 :(得分:2)

不应该有任何性能差异(如果有的话,我认为第二个性能差异较小),但只要使用更清晰的那个。我也更喜欢第一个。 :)

如果你发现它后来有所作为,那么继续改变它,但你知道他们说的是什么:过早的优化是所有邪恶的根源。

答案 4 :(得分:2)

其他人已经注意到可读性(通常)更重要,并且如果提供示例的方式,您实际上并不需要。此外,还有旧锯:"Premature optimization is the root of all evil"

那就是说,找出性能的最好方法是测试。所以,我把你的两个例子放到函数中(将range[0,1023]更改为range(0, 1023)以使其工作)将第一个例子命名为“without_not”,将第二个例子命名为“with_not”,并创建一个简单的main来测试使用testit module

def main():
    global outfile
    outfile = open('test.dat', 'wt')
    num_tests = 10000
    without_timer = timeit.Timer(stmt=without_not)
    with_timer = timeit.Timer(stmt=with_not)
    print 'without result: ', without_timer.timeit(number=num_tests)
    print 'with result: ', with_timer.timeit(number=num_tests)
    outfile.close()

然后我跑了几次测试。正如我和其他回答者所预料的那样,not以外的版本在每次测试中跑得更快 - 大约0.6% - 更快; IMO,还不够担心。 (在某些情况下,它可能很重要,但如果是这种情况,我会推荐C或其他一些编译语言。)

答案 5 :(得分:0)

我无法验证这一点,但是使用常识,我认为第一个会表现稍好一些。第二个是评估&lt;然后它评估不。这是一个额外的操作。它每次都会这样做。再加上直观,第一个更有意义。

答案 6 :(得分:0)

是否会有性能差异?是的,处理器必须在if-else语句的情况下进行预测跳转。你会注意到差异吗?没门。你的编译器/优化器会在执行之前将你的代码颠倒过来。你的计算可能不会花费几千年的时间来解决问题。你甚至可能不使用实时系统。

正如其他人所说:注重可读性,不要预先优化不重要的部分