我需要创建一些消息的ID以及原始列表中的位置。该代码用于对消息进行排序,稍后根据ID处理它们。
以下作品,可读,但速度慢。
import numpy as np
IDs=np.array([354,45,45,34,354])#example, the actual array is huge
Dict={}
for counter in xrange(len(IDs)):
try:
Dict[IDs[counter]].append(counter)
except:
Dict[IDs[counter]]=[counter]
print(Dict)
#{354: [0, 4], 34: [3], 45: [1, 2]}
任何想法如何加快速度?不需要对列表进行排序。稍后在代码中使用如下,然后丢弃dict
for item in Dict.values():
Position_of_ID=Position[np.array(item)]
...
答案 0 :(得分:1)
尝试使用defaultdict
和enumerate
:
from collections import defaultdict
Dict = defaultdict(list)
for i,id in enumerate(IDs):
Dict[id].append(i)
(使用try
和except
是个坏主意if the exceptions aren't rare)
答案 1 :(得分:0)
我提出的最快的代码就是这个。它做了更多的数学,不是那么可读,我并不自豪,但它更快(即使有大型数组):
Sorted_positions_of_IDs=np.argsort(IDs,kind='mergesort')
SortedIDs=IDs[Sorted_positions_of_IDs]
Position=0
Position_last=-1
Dict={}
while(Position<len(Sorted_positions_of_IDs)):
ID=SortedIDs[Position]
Position_last=np.searchsorted(SortedIDs,ID,side='right')
Dict[ID]=Sorted_positions_of_IDs[Position:Position_last]
Position=Position_last
无论如何,好的想法将不胜感激。
答案 2 :(得分:0)
Mutch更快地使用&#34; dictcompression&#34;
public void loginapi(){
String username = user.getText().toString();
String password = passwd.getText().toString();
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<List<Akses>> call = apiService.getEmployeeAkses(donat, username, password);
call.enqueue(new Callback<List<Akses>>() {
@Override
public void onResponse(Call<List<Akses>> call, Response<List<Akses>> response) {
String waduser,wadpass;
// you should use (ArrayList<Akses>) response.body;
ArrayList<Akses> aksesList = (ArrayList<Akses>) response.body;
waduser = aksesList.get(0).getUsername().toString();
wadpass = aksesList.get(0).getPassword().toString();
}
@Override
public void onFailure(Call<List<Akses>> call, Throwable t) {
Log.e("Errore : ", t.getMessage());
Toast.makeText(getApplicationContext(), "Terjadi Kesalahan masalah API", Toast.LENGTH_SHORT);
}
});
}