我有一個包含objects的排序串列,我想獲取串列的最后一個值(通過使用get_val方法檢索)的第一個索引。我寫了這個函式,但我想知道是否有任何方法可以進一步優化它?
def index_last_value(tbl, get_val=lambda obj:obj):
tbl_len, prev_v = len(tbl), get_val(tbl[-1])
for i,v in enumerate(reversed(tbl)):
v = get_val(v)
if v == prev_v:
index = tbl_len-i-1
if v != prev_v or i 1 == tbl_len:
return index
prev_v = v
class MyObject:
def __init__(self, v):
self.v = v
tbl_1 = list(map(MyObject, [1,1]))
tbl_2 = list(map(MyObject, [1,1,2,2,2]))
index_last_value(tbl_1, get_val=lambda obj:obj.v) # -> 0
index_last_value(tbl_2, get_val=lambda obj:obj.v) # -> 2
編輯:該串列不包含數字,它包含物件。
uj5u.com熱心網友回復:
這快了約 33%(對于給定的資料):
def index_last_value2(tbl, get_val=lambda obj:obj):
prev_v = get_val(tbl[-1])
for i in range(len(tbl) - 2, -1, -1):
if get_val(tbl[i]) != prev_v:
return i 1
return 0
通過將引數get_val函式更改為屬性名稱,您可以獲得另外約 15% 的加速:
def index_last_value3(tbl, val_name):
prev_v = tbl[-1].__dict__[val_name]
for i in range(len(tbl) - 2, -1, -1):
if tbl[i].__dict__[val_name] != prev_v:
return i 1
return 0
index_last_value3(tbl_1, val_name='v')
index_last_value3(tbl_2, val_name='v')
以相反的順序進行分析以確保 RAM 操作不支持優化版本:
44 1001 2682.0 2.7 3.8 for _ in range(1000):
45 1000 6420.0 6.4 9.1 index_last_value3(tbl_1, val_name='v')
46 1000 7857.0 7.9 11.1 index_last_value3(tbl_2, val_name='v')
47 1001 2745.0 2.7 3.9 for _ in range(1000):
48 1000 7676.0 7.7 10.9 index_last_value2(tbl_1, get_val=lambda obj: obj.v)
49 1000 10370.0 10.4 14.7 index_last_value2(tbl_2, get_val=lambda obj:obj.v)
50 1001 2670.0 2.7 3.8 for _ in range(1000):
51 1000 12083.0 12.1 17.1 index_last_value(tbl_1, get_val=lambda obj: obj.v)
52 1000 18007.0 18.0 25.5 index_last_value(tbl_2, get_val=lambda obj: obj.v)
uj5u.com熱心網友回復:
一般回答
我們從頭到尾掃描串列
def index_last_value(tbl, get_val=lambda obj:obj):
lastv = get_val(tbl[-1])
for i,v in enumerate(tbl):
if get_val(v) == lastv:
return i
特殊情況:值是連續的(即沒有間隙):[1, 1, 2, 2, 2] 是可能的,[1, 1, 2, 3, 2] 不是。
我們從頭到尾掃描串列,
我們可以反轉串列,但我們也可以不反轉它:
def index_last_value(tbl, get_val=lambda obj:obj):
len_tbl = len(tbl)
if len_tbl == 1:
return 0
lastv = get_val(tbl[-1])
for i,v in enumerate(tbl[-2::-1]):
if get_val(v) != lastv:
return len_tbl - i - 1
return 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/388333.html
上一篇:python-如何首先根據初始串列的單個元素將串列拆分為子串列,然后簡單地在python中將串列的連續部分拆分?
