7

这两种 if 语句的编写方式之间是否存在性能差异或风格偏好?基本上是一样的,第一个条件只会满足一次,而另一个条件每隔一段时间就会满足一次。只满足一次的条件应该是第一还是第二?它对性能有影响吗?如果性能相同,我更喜欢第一种方式。

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])

对比

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:])
4

7 回答 7

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

我认为这是您情况下最有效的方法。

于 2012-10-01T20:00:16.820 回答
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) 更有效。

道德:随心所欲。

于 2012-10-01T20:20:28.350 回答
5

我认为可读性比性能优势更重要(如果有的话),尽管我认为没有任何区别。

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

于 2012-10-01T19:59:04.447 回答
2

不应该有任何性能差异(如果有的话,我认为第二个性能会降低),但只需使用对您来说更清晰的那个。我也更喜欢第一个。:)

如果你以后发现它有所作为,那就去改变它,但你知道他们在说什么:过早的优化是万恶之源。

于 2012-10-01T19:58:28.477 回答
2

其他人已经注意到可读性(通常)更重要,并且您并不真正需要 if 示例的呈现方式。此外,还有一句老话:“过早的优化是万恶之源”

也就是说,找出性能的最佳方法是测试。因此,我将您的两个示例放入函数中(更改range[0,1023]range(0, 1023)使工作正常),将第一个示例命名为“without_not”,第二个示例命名为“with_not”,并使用testit 模块创建了一个简单的 main 进行测试:

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 或其他一些编译语言。)

于 2012-10-01T20:33:30.097 回答
0

我无法验证这一点,但根据常识,我认为第一个会表现得更好。第二个是评估 <,然后评估 not。那是一项额外的操作。它每次都这样做。加上直觉上第一个更有意义。

于 2012-10-01T19:59:41.690 回答
0

是否会有性能差异?是的,处理器必须在 if-else 语句的情况下进行预测性跳转。你会注意到不同吗?没门。您的编译器/优化器将在执行之前将您的代码倒置。你的计算可能不需要几千年就能让它变得重要。您甚至可能不使用实时系统。

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

于 2012-10-20T23:42:22.960 回答