这两种撰写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:])
答案 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语句的情况下进行预测跳转。你会注意到差异吗?没门。你的编译器/优化器会在执行之前将你的代码颠倒过来。你的计算可能不会花费几千年的时间来解决问题。你甚至可能不使用实时系统。
正如其他人所说:注重可读性,不要预先优化不重要的部分