mã tuyệt vời của Sven đã làm chỉ là một chút quá nhiều công việc và chould đã sử dụng tuple giải nén thay vì pop (). Ngoài ra, nó có thể đã thêm một bảo vệ if x != y
để kiểm tra x và y là khác biệt.Dưới đây là những gì các câu trả lời được cải thiện trông giống như:
# create the set just once
choices = {'a', 'b', 'c'}
x = 'a'
y = 'b'
# the main code can be used in a loop
if x != y:
z, = choices - {x, y}
Sau đây là các timings so sánh với một bộ thời gian để hiển thị các 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
Dưới đây là kết quả của timings:
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
Những thời gian này cho thấy hiệu suất phiên bản gốc thay đổi một chút tùy thuộc vào các câu lệnh if được kích hoạt d bởi các giá trị đầu vào khác nhau.
Nguồn
2012-01-09 19:06:26
Câu trả lời ngắn gọn là Các bộ của Python rất tuyệt vời để kiểm tra tính khác biệt và để tính toán các phần tử không sử dụng. –
Cảm ơn tất cả các câu trả lời, tôi đoán tôi sẽ sử dụng giải pháp bằng cách sử dụng thiết lập như là hợp lý của nó nhanh chóng và dễ đọc, Bảng tra cứu dựa trên câu trả lời của Óscar López cũng intresting. –