亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:檢查 2 個列表是否一起增加的任何優化方法?

Python:檢查 2 個列表是否一起增加的任何優化方法?

慕婉清6462132 2021-08-17 16:38:00
假設我們有 2 個列表a = [1,2,4,3,5]和b = [103,122,800,500,1000]有沒有一種優化的方法可以檢查它們是否“一起增加”?我當前的解決方案采用循環:for i in range(1,len(a)):   if (a[i-1] < a[i] and b[i-1] > b[i]) or (a[i-1] > a[i] and b[i-1] < b[i]):       print('wrong')有沒有更好的辦法?筆記:解決方案不需要特定于列表(實際上任何數據結構都可以)兩個迭代器不需要增加相同的單位數,只需一起增加即可。
查看完整描述

3 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

你真的不能得到任何比O(n)的速度更快,但你可以讓你的代碼有點用較短,也許更容易閱讀numpy.diff和比較sign的差異文件,a并且b:


>>> from numpy import diff, sign

>>> a, b = [1,2,4,3,5], [103,122,800,500,1000]

>>> sign(diff(a))

array([ 1,  1, -1,  1])

>>> all(sign(diff(a)) == sign(diff(b)))

True

>>> a, b = [1,2,4,3,5], [103,122,800,500,100]

>>> all(sign(diff(a)) == sign(diff(b)))

False

這種解決方案的缺點是,它不使用懶惰評價,即它計算和整個比較sign(diff(...))陣列即使的“increasingness”a和b不同之處在于非常第一位置。如果列表很長,您應該考慮使用另一種方法。


查看完整回答
反對 回復 2021-08-17
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

就 O(order notation) 而言,假設列表沒有順序,你不能比線性更好。但是,您可以使用諸如 cython、numba 之類的 Python 編譯器來加速您的代碼。您使用numba 的代碼:


import numpy as np

import numba as nb


@nb.njit()

def vary_together(a, b):

    for i in range(1,len(a)):

       if (a[i-1] < a[i] and b[i-1] > b[i]) or (a[i-1] > a[i] and b[i-1] < b[i]):

           return False

    return True 

您必須使用大型列表才能看到性能優勢。例如,如果:


a = np.array([randint(0,100) for i in range(10000000)])

然后,


vary_together(a, a)  # a as both arguments so as to make it complete the loop

與您的解決方案的性能比較如下:


您的解決方案:8.09s 變化

_together:0.2(在第二次運行時為編譯時間打折)。


如果您需要在腳本中一次又一次地運行代碼,請cache=True在nb.njit裝飾器中執行。


查看完整回答
反對 回復 2021-08-17
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

我們可以使用 python 迭代器提供的惰性求值,這意味著一旦它們沒有相同的變化符號,我們就不需要繼續遍歷兩個列表(結構)


def compare_variation( a, b ):

    a_variations = ( a[ i - 1 ] < a[ i ] for i in range( 1, len( a ) ) )

    b_variations = ( b[ i - 1 ] < b[ i ] for i in range( 1, len( b ) ) )

    return all( x == y for x, y in zip( a_variations, b_variations  ) )


查看完整回答
反對 回復 2021-08-17
  • 3 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號