簡體   English   中英

兩個值的最大值和最小值

[英]Maximum and minimum of two values

我正在編寫一個將被多次調用的代碼,我想知道是否有比這更快(計算明智)的東西:

maximum = max(a, b)  # a and b are integers
minimum = min(a, b)

該代碼有效,但我想一旦我調用了max ,我們就會通過調用min以某種方式浪費計算能力。 我試圖查看 inte.net 上的問題,但我無法用語言表達它。

這更取決於數據類型ab是什么。 如果它們是簡單類型(例如,數字),則:

if a > b:
  maximum, minimum = a, b
else:
  maximum, minimum = b, a

...可能比調用 min 和 max 函數更快。

或者,如果您喜歡單線:

maximum, minimum = (a, b) if a > b else (b, a)

如果您在這里擔心計算能力,那應該不是問題。 不管你需要定義兩個不同的變量,最大值和最小值,所以你這樣做的方式很好。 如果您真的不想使用 min,那么類似這樣的方法可能會起作用,但它已經比您所做的更復雜了:

if max(a, b) == a:
    maximum = a
    minimum = b
else:
    maximum = b
    minimum = a

在數學上min(a,b)a+b-max(a,b)相同。 這是否是一種改進值得商榷。

我已經根據您的建議(所有非常聰明的建議,謝謝。:) 運行了這段代碼,以嘗試查看更快的速度。 差異實際上非常令人印象深刻:

import time

def whosfaster(a, b):
    start_time = time.time()
    maximum = max(a, b)
    minimum = min(a, b)
    method0 = time.time() - start_time


    start_time = time.time()
    if a > b:
        maximum, minimum = a, b
    else:
        maximum, minimum = b, a
    method1 = time.time() - start_time

    start_time = time.time()
    maximum, minimum = max(a, b), min(a, b)
    method2 = time.time() - start_time

    start_time = time.time()
    maximum, minimum = (a, b) if a > b else (b, a)
    method3 = time.time() - start_time

    start_time = time.time()
    if max(a, b) == a:
        maximum = a
        minimum = b
    else:
        maximum = b
        minimum = a
    method4 = time.time() - start_time

    return maximum, minimum, method0, method1, method2, method3, method4

total = [0, 0, 0, 0, 0]
for a in range(1, 5000):
    for b in range(1, 5000):
        maximum, minimum, method0, method1, method2, method3, method4 = whosfaster(a, b)
        total[0] += method0
        total[1] += method1
        total[2] += method2
        total[3] += method3
        total[4] += method4

print(total)

我得到的結果是:

    Run number 1 : 
[7.562410593032837, 2.4336302280426025, 7.17744255065918, 3.160186529159546, 5.583981037139893]
    Run number 2 but my laptop was on battery saver mode :
[12.757804155349731, 4.507119178771973, 13.357162237167358, 5.251198768615723, 8.934610605239868]

如果有人想在他們的終端上運行它進行比較,歡迎您這樣做,我的筆記本電腦不是最快的!!

編輯:我真的不知道如何將 Mark Ransom 的回答付諸實踐,所以我沒有嘗試。 歡迎編輯我的帖子並更改我的代碼,如果您知道如何操作,可以在您的手上重新運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM