Đoạn mã tuyệt vời của Sven đã làm quá nhiều việc và đáng lẽ phải sử dụng bộ giải nén tuple thay vì pop () . Ngoài ra, nó có thể có thêm một bộ phận bảo vệ if x != y
để kiểm tra xem x và y có khác biệt hay không. Đây là câu trả lời được cải thiện trông như thế nào:
choices = {'a', 'b', 'c'}
x = 'a'
y = 'b'
if x != y:
z, = choices - {x, y}
Dưới đây là thời gian so sánh với bộ thời gian để hiển thị hiệu suất tương đối:
import timeit, itertools
setup_template = '''
x = %r
y = %r
choices = {'a', 'b', 'c'}
'''
new_version = '''
if x != y:
z, = choices - {x, y}
'''
original_version = '''
if x == 'a' and y == 'b' or x == 'b' and y == 'a':
z = 'c'
elif x == 'b' and y == 'c' or x == 'c' and y == 'b':
z = 'a'
elif x == 'a' and y == 'c' or x == 'c' and y == 'a':
z = 'b'
'''
for x, y in itertools.product('abc', repeat=2):
print '\nTesting with x=%r and y=%r' % (x, y)
setup = setup_template % (x, y)
for stmt, name in zip([original_version, new_version], ['if', 'set']):
print min(timeit.Timer(stmt, setup).repeat(7, 100000)),
print '\t%s_version' % name
Đây là kết quả của thời gian:
Testing with x='a' and y='a'
0.0410830974579 original_version
0.00535297393799 new_version
Testing with x='a' and y='b'
0.0112571716309 original_version
0.0524711608887 new_version
Testing with x='a' and y='c'
0.0383319854736 original_version
0.048309803009 new_version
Testing with x='b' and y='a'
0.0175108909607 original_version
0.0508949756622 new_version
Testing with x='b' and y='b'
0.0386209487915 original_version
0.00529098510742 new_version
Testing with x='b' and y='c'
0.0259420871735 original_version
0.0472128391266 new_version
Testing with x='c' and y='a'
0.0423510074615 original_version
0.0481910705566 new_version
Testing with x='c' and y='b'
0.0295209884644 original_version
0.0478219985962 new_version
Testing with x='c' and y='c'
0.0383579730988 original_version
0.00530385971069 new_version
Các mốc thời gian này cho thấy rằng hiệu suất của phiên bản gốc thay đổi khá nhiều tùy thuộc vào việc câu lệnh if nào được kích hoạt bởi các giá trị đầu vào khác nhau.