Dict, set, list!

Przy okazji niedawnego code review dostałem pytanie, czemu w skrypcie napisanym w Pythonie nie korzystam z obiektu typu set, tylko z dict. Chodziło o cache na kilka tysięcy elementów, odpytywany kilkaset tysięcy razy. Z przyzerowym hit ratio. Zdziwiłem się, bo kojarzyłem, że czytelna konstrukcja wykorzystująca in dla obiektu typu list

data = [x for x in range(1000)]
y = 1001
if y in data:
    print("Hit")

jest raczej wolna. Zwłaszcza w porównaniu z nieco mniej czytelnym wariantem z użyciem dict:

data = {x: True for x in range(1000)}
y = 1001
if data.get(y):
    print("Hit")

Odpisałem o co chodziło i usłyszałem, że przecież set jest szybki. Coś mi zaświtało. Bo niby set jest bardziej podobny w użyciu do listy, ale pod spodem ma parę ciekawych właściwości. Zresztą, gdy poprosimy LLM o optymalizację pod kątem szybkości, otrzymamy coś w stylu[1]:

data = {x for x in range(1000)} # Converted 'data' to a set
y = 1001
if y in data:  # Checking membership still works the same way
    print("Hit")

Różnice w czasie wykonania możemy zgrubnie i niezbyt elegancko sprawdzić w następujący sposób:

Jak już jesteśmy przy tego typu ciekawostkach. A co jeśli mamy w cache ciągi znaków i chcemy sprawdzić, czy nasz ciąg znaków nie kończy się jednym z ciągów z cache? LLM poproszony o optymalizację znowu podpowiada, że lepszy jest set. Ale nieoczekiwanie sugeruje też wykorzystanie regexpów. I co? Ku mojemu zaskoczeniu regexp w stylu

pattern = re.compile("("+"|".join(our_set)+")"$")
return bool(pattern.search(tested_value))

okazuje się najszybszym rozwiązaniem! Nie to, że uważam regexpy za szczególnie wolne, co to, to nie. Oczywiście pattern wykonujemy raz, nie dla każdej testowanej wartości.

Dalsza lektura:
O’reily High performance Python Dictionaries and Sets

[1] Tak, różnica niezbyt rzuca się w oczy przy takim zapisie. Mało widać różnicę między dict a set. Kiedyś już o tym wspominałem. Czytelniejszy zapis – którego chyba nikt nie używa – tamże.

Daft Social – anti social network

Dziś dowiedziałem się o serwisie Daft Social. Przyznaję, że pomysł jest interesujący. Jest to minimalistyczne medium społecznościowe. Czy też antyspołecznościowe. Wielu rzeczy nie ma. Na przykład nie ma możliwości interakcji z treścią. Nie tylko przez innych, ale nawet sam autor nie ma możliwości ani edycji, ani usunięcia zamieszczonego wpisu. Nie ma tytułu, nie ma hashtagów. Nie ma dokładnego czasu zamieszczenia wpisu – jest tylko data. Z rzeczy które są – jest dostępny RSS.

Tworzenie wpisów czy też cała interakcja z platformą także jest minimalistyczna. Wpisy tworzymy poprzez… wysyłanie maili, a cała treść wpisu jest w jego temacie. Body maila nie ma już żadnego znaczenia. Można zamieszczać linki do stron oraz obrazki przez podanie URLi. Nadal w temacie maila.

Niestety, brakuje też security. Jeśli chodzi o zabezpieczenia, to mamy tylko losowego maila, na którego wysłanie powoduje dodanie wpisu. Czyli pojedynczy, stały sekret. Bez możliwości jego zmiany, bez 2FA. Bez możliwości przypomnienia – choć tu podanych jest parę tricków. Bez możliwości ograniczenia, z jakiego adresu email mają być przyjmowane maile.

Mimo wszystko pomysł mi się spodobał. Na tyle, że założyłem konto na Daft Social. Nie wiem jeszcze czy i jak będę korzystał. Póki co planuję wysyłać tam powiadomienia o nowych wpisach na blogu, podobne do tych, które trafiają na Blablera.

Goodbye Flattr!

Po 14 latach serwis Flattr kończy działalność. W swoim czasie mocno im kibicowałem. Jak widać nawet tag na blogu mam…

Wydaje mi się, że trochę wyprzedzili epokę – coś podobnego, czyli dotacje dla czytanych storn zrobił niedawno Brave. Tyle, że wbudowane w przeglądarkę. Liczyłem, że Flattr zastąpi Wykop. Przeliczyłem się. Ale różnej maści serwisy umożliwiające dotowanie twórców stają się popularne.

Potem przestałem kibicować i korzystać. Dziś spróbowałem się zalogować, po raz ostatni. Mam zapisane hasło w managerze. Niestety, bez powodzenia. Możliwe, że przegapiłem jakieś zmiany – teraz wymagany jest email, zapisany mam login. Spróbowałem odzyskać hasło, ale żadnego z maili także nie rozpoznało. Cóż, trudno.