Buduję klasę z między innymi słownikiem z kluczami całkowitymi i wartościami listy. Dodawanie wartości do tego słownika wydaje się być jednak wąskim gardłem i zastanawiałem się, czy może być jakiś sposób na przyspieszenie mojego kodu.Python: optymalny sposób dodawania do słownika z wartościami listy
class myClass():
def __init__(self):
self.d = defaultdict(list)
def addValue(self, index, value):
self.d[index].append(value)
Czy to naprawdę optymalny sposób na zrobienie tego? Nie bardzo zależy mi na kolejności wartości, więc może istnieje bardziej odpowiednia struktura danych z szybszym dodatkiem. Z drugiej strony, "append" nie wydaje się być głównym problemem, ponieważ jeśli po prostu dołączę do pustej listy, kod jest o wiele szybszy. Domyślam się, że to ładowanie wcześniej zapisanej listy, która zajmuje większość czasu?
I okazało się, że problem nie leży w dict, ale na liście append (choć twierdził inaczej w moim oryginalnego postu, na który ja przepraszam). Ten problem jest spowodowany błędem w garbagerze Pythona, który jest dobrze wyjaśniony na this other question. Wyłączenie gc przed dodaniem wszystkich wartości, a następnie ponownym włączeniem, znacznie przyspiesza proces!
Dodawanie elementów do listy i uzyskiwanie wartości z obiektu lub dyktowania nie zajmuje dużo czasu. Aby przyspieszyć program, należy znaleźć wąskie gardło poprzez profilowanie, a nie przez zmianę losowych fragmentów kodu. –
Czy mapowanie elementów do istniejących kluczy jest znacznie szybsze niż dodawanie wartości do nowych kluczy? –
Właśnie się dowiedziałem, że problem nie jest w dyktafonie, ale na liście dołączam (chociaż w moim oryginalnym poście twierdziłem inaczej, za co przepraszam). Następnie znalazłem odpowiedź na moje pytanie na http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively- wolniej. Ponieważ jestem nowy na tej stronie, nie wiem, jaka jest standardowa procedura: czy powinienem usunąć mój pierwotny wpis? Lub dodać powyższe dane i odpowiedź na post? – niefpaarschoenen