Pull to refresh

Comments 9

На Rust написаны токенизаторы из популярной ныне библиотеки Transformers от HuggingFace. Для меня это отличный пруф того, что совмещение Python и Rust может стать стандартом в ML-библиотеках.

О, я видел эту библиотеку, говнокода там хватает.

Отлично, какой простор для Вас улучшить и стать контрибьютором!

Не, там, как в анекдоте, "всю систему менять надо". То есть если и делать PR, то там чуть ли не весь код перелопачивать надо. Перспектива непривлекательная, да ещё и не факт, что оценят и не продолжат говнокодить.

Неужели Питер планирует издать какую-то книгу по Rust'у?
))так эту книгу издательство ДМК выпустило)
увидев код, что-то вызвало у меня сомнение в честности результатов.
import math
def compute_entropy_pure_python(data):
    """Compute entropy on bytearray `data`."""
    counts = [0] * 256
    entropy = 0.0
    length = len(data)
    for byte in data:
        counts[byte] += 1
    for count in counts:
        if count != 0:
            probability = float(count) / length
            entropy -= probability * math.log(probability, 2)
    return entropy

from math import log
from collections import Counter
def compute_entropy_my_python(data):
    """Compute entropy on bytearray `data`."""
    length = float(len(data))
    counts = (count / length for count in Counter(bytes(data)).values())
    return sum(-pro * log(pro, 2) for pro in counts)

from numpy import bincount, random, uint8
from scipy.stats import entropy
def compute_entropy_scipy_numpy(data):
    """Вычисляем энтропию bytearray `data` с SciPy и NumPy."""
    counts = bincount(bytearray(data))
    return entropy(counts, base=2)

from time import process_time
NUM = 1000000
VAL = random.randint(0, 256, size=(NUM, ), dtype=uint8)

if __name__ == '__main__':
    start = process_time() 
    print(compute_entropy_pure_python(VAL))
    print(process_time()  - start)

    start = process_time() 
    print(compute_entropy_my_python(VAL))
    print(process_time()  - start)

    start = process_time() 
    print(compute_entropy_scipy_numpy(VAL))
    print(process_time()  - start)

Итог:
(projects) C:\projects>python pure_python.py                                                                                                                      7.999802815300323 - стат энтропия                                                                                                                                                                
0.390625   - это скорость кода из статьи                                                                                                                                                                            
7.999802815300329 - стат энтропия                                                                                                                                                                   
0.09375  - это скорость нормального python кода                                                                                                                                                                             
7.999802815300324 - стат энтропия                                                                                                                                                                 
0.015625  - это скорость c nympy

отличия ну точно не в сотни раз.
Увы, повторить эксперимент с рустовской библиотекой я так и не смог. Но, что то мне подсказывает, что цифры будут не столь оптимистичны.

Попробуйте добавить флаг --release, когда будете компилировать растовый модуль. Справедливость восторжествует.

Sign up to leave a comment.