• Почему время выполнения скрипта отрицательное?

    @Fixid
    Вы не правильно понимаете как работает timeit.timeit.
    Для измерения времени работы кода надо передать его внутрь timeit.timeit.
    Просто внимательно прочитайте.

    Альтернатива:
    import time
    start_time = time.time()
    --- измеряемый код  ----
    print("--- %s seconds ---" % (time.time() - start_time))
    Ответ написан
    Комментировать
  • Почему время выполнения скрипта отрицательное?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    timeit.timeit() вам выдает совсем не то, что Вы думате! В каждом из случаев выдается время простой инструкции pass
    Вам нужно вместо timeit.timeit() использувать time.time()!
    from multiprocessing import Pool
    import time
     
    def doubler(number):
        return number * 2
     
    if __name__ == '__main__':
        start = time.time()
    
        numbers = [1,2,3,4,5,6,7,8,9]
        pool = Pool(processes=9)
        print(pool.map(doubler, numbers))
    
        end = time.time()
        print(end - start)
    Ответ написан
    Комментировать
  • Какова сложность операции вставки у deque?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    > https://wiki.python.org/moin/TimeComplexity

    > A deque (double-ended queue) is represented internally as a doubly linked list. (Well, a list of arrays rather than objects, for greater efficiency.) Both ends are accessible, but even looking at the middle is slow, and adding to or removing from the middle is slower still.

    из этого следует, что O(N). И даже если б это был обычный одно или дву связный список, то элемент, куда вставлять, ещё надо найти, а это O(N), если передаётся по индексу, а не указателю.
    Ответ написан
    Комментировать
  • Какова сложность операции вставки у deque?

    tumbler
    @tumbler Куратор тега Python
    бекенд-разработчик на python
    https://wiki.python.org/moin/TimeComplexity
    collections.deque
    A deque (double-ended queue) is represented internally as a doubly linked list. (Well, a list of arrays rather than objects, for greater efficiency.) Both ends are accessible, but even looking at the middle is slow, and adding to or removing from the middle is slower still.

    TLDR: "В середину" всё плохо.
    Ответ написан
    Комментировать
  • Правильно ли применён принцип единичной ответственности?

    rockon404
    @rockon404
    Frontend Developer
    По принципу единственной ответственности метод getSum должен лишь возвращать сумму. Никаких дополнительных действий в нем происходить не должно.

    Насчет последнего примера трудно что-либо посоветовать, так как это имеет мало общего с реальным клиентским кодом. Сам Summator лишняя неудобная сущность которую можно смело заменить на:
    const sum = arr => arr.reduce((acc, i) => acc + i);
    
    const calculateSquaresSum = arr => sum(arr.map(i => i.calcArea()));


    Для логгирования в dev режиме обычно используют декораторы или middleware.
    Ответ написан
    Комментировать
  • Почему запросы выполняются последовательно?

    Kurku
    @Kurku
    Погромист
    Читай документацию:
    >>> help(Process.join)
    join(self, timeout=None)
        Wait until child process terminates

    Это значит, что интерпретатор будет ждать пока процесс закончится.
    То есть ты в своем коде на самом деле выполняешь все последовательно.
    А тебе надо писать что-то такое:
    from multiprocessing import Process
    from time import sleep
         
    def worker(n):
        print("the worker went to the office")  
        sleep(n)
        print("the worker has been walking for %d sec" % n)
         
    if __name__ == "__main__":
        plist = [] 
        for i in range(4, 0, -1):
            proc = Process(target=worker, args=(i,))
            plist.append(proc)
         
        for proc in plist:
            proc.start()

    Это возвратит:

    the worker went to the office
    the worker went to the office
    the worker went to the office
    the worker went to the office
    the worker has been walking for 1 sec
    the worker has been walking for 2 sec
    the worker has been walking for 3 sec
    the worker has been walking for 4 sec

    И да, процессы и потоки вещи совсем разные. С потоками работать намного удобнее. Так почему бы не использовать их.
    Ответ написан
    2 комментария
  • Можно-ли скачать видео с YouTube используя DevTools?

    Есть такая «секретная» ссылка: www.youtube.com/get_video_info?video_id=XXXXXX
    Вместо XXXXXX подставьте хэш видео, который в ссылке на ролик, типа youtu.be/BWCiWZtrWXU после слеша.

    По этой (первой) ссылке вернутся URL-encoded данные. Распакуйте их и возьмите параметр url_encoded_fmt_stream_map. Его значение опять надо распаковать как URL-параметры. И из результата вытащить параметр url – это ссылка на единый скачивабельный видеофайл.

    Например, в консоли браузера:
    function getUrlParams(search) {
        let hashes = search.slice(search.indexOf('?') + 1).split('&')
        let params = {}
        hashes.map(hash => {
            let [key, val] = hash.split('=')
            params[key] = decodeURIComponent(val)
        })
    
        return params
    }
    var s = '------'; // здесь длиннющая строка из ответа /get_video_info
    var a = getUrlParams(s);
    var b = getUrlParams(a.url_encoded_fmt_stream_map);
    console.log(b.url); // эту ссылку открываем в браузере - это скачиваемый видеофайл


    Очень надеюсь, что вы покопаетесь в этих данных более подробно, разберётесь, как получать прямые ссылки на скачиваемые файлы во всех форматах и размерах, которые предлагает YouTube, и напишете короткий материал на Хабр по результатам, а также опубликуете gist с рабочим кодом для консоли браузера.
    Ответ написан
    3 комментария
  • Правильно ли так очищать память?

    kagary06
    @kagary06
    Человек
    • Если нужно удалить переменную любого типа del variable
    • Если нужно очистить память, но при этом переменная продолжит существовать variable = None
    • Если нужно очистить память для списка/кортежа/множества, но при этом не изменять тип variable.clear()
    Ответ написан
    Комментировать
  • Правильно ли так очищать память?

    @deliro
    Зачем вычищать память, если с этим сборщик мусора справляется? Думаешь, ты умнее него?
    Ответ написан
    4 комментария
  • Как избавиться от таймаутов?

    @abbrakadabbra
    Следующая строчка может быть выполнена, но если в ней не будет элемента, то будет эксепшен.

    Асинхронные подгрузки на странице, непредсказуемые изменения в DOM?
    Думаю, для этого вам нужно использовать методы типа wait until element is visible, делать проверки is present, is displayed etc.
    На практике было такое, с очень сложным и неконсистентным поведением. Использовать вплоть до try/except, вылавливая эксепшены и подстраивая поведение.
    Ответ написан
    2 комментария
  • Как избавиться от таймаутов?

    qlkvg
    @qlkvg
    python backend developer
    Только после. Но не всегда, потому что selenium полон магии. Используйте явные ожидания, это лучший путь.
    Ответ написан
    Комментировать
  • Чем отличается генератор от корутины?

    longclaps
    @longclaps
    Ответ Дмитрий Шицков был бы хорош лет 5 назад, но сейчас нуждается в уточнении. PEP 492, все дела.

    import asyncio, warnings, itertools
    
    def a():
        for ch in 'foo':
            print(ch, 'from a')
            yield
    
    @asyncio.coroutine
    def b():
        for ch in 'foo':
            print(ch, 'from b')
            yield
    
    async def c():
        for ch in 'foo':
            print(ch, 'from c')
            await asyncio.sleep(0)
    
    print('как ни странно, здесь все три прокатывают\n')
    loop = asyncio.get_event_loop()
    tasks = [loop.create_task(f()) for f in (a, b, c)]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()
    
    print('\nмежду тем, есть нюансы\n')
    with warnings.catch_warnings():
        warnings.simplefilter('ignore')
        dirs = [[*dir(f), *dir(f())] for f in (a, b, c)]
    for s in sorted(set(itertools.chain(*dirs))):
        if not all(s in d for d in dirs):
            print(f'{s:14}', *['-+'[s in d] for d in dirs])

    Видно, что a и b отличаются лишь тем, что b зарегистрирована как корутина, а вот c вовсе другая.
    Займись этим вопросом, чо нароешь - отпишись.
    Ответ написан
    Комментировать
  • Что такое asyncio и в чём реальное отличие от многопоточности?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Один человек ставит кастрюлю на плиту, ждёт пока она закипит, закидывает пельмени, ждёт пока сварятся, снимает, ставит вторую, ждёт пока закипит... - последовательное однопоточное выполнение.

    Один человек ставит две кастрюли на плиту, как только одна из них закипела, забрасывает пельмени и т.д. - асинхронное выполнение.

    Два человека ставят две кастрюли... - многопоточное выполнение.

    Очевидно, что при асинхронном выполнении ресурсов требуется меньше, а скорость та же, что и при многопоточном. Именно поэтому проблема c10k могут решать только асинхронные сервера. Минусы в том, что асинхронный код сложнее и не всё можно выполнять асинхронно.
    Ответ написан
    3 комментария
  • Чем отличается генератор от корутины?

    Корутина - частный случай генератора. Отличий нет, т.к. корутина и есть узкоспециализированный генератор.
    https://habr.com/ru/post/196918/
    Ответ написан
    Комментировать
  • Почему hashlib не устанавливается для python3?

    @SD4RK
    hashlib - стандартная библиотека Python начиная с версии 2.5 (если не ошибаюсь). Та библиотека, которую пытаетесь установить вы, создана для версий Python ниже 2.5, поэтому неудивительно, что python 3.6 ругается на синтаксис.
    Ответ написан
    Комментировать
  • Почему hash() возвращает разные значения?

    deepblack
    @deepblack Куратор тега Python
    Потому что

    Note By default, the __hash__() values of str, bytes and datetime objects are “salted” with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.
    This is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst case performance of a dict insertion, O(n^2) complexity. See www.ocert.org/advisories/ocert-2011-003.html for details.

    Changing hash values affects the iteration order of dicts, sets and other mappings. Python has never made guarantees about this ordering (and it typically varies between 32-bit and 64-bit builds).

    See also PYTHONHASHSEED.


    UPD:
    Можно заюзать https://hashids.org/python/

    Hashids is a small open-source library that generates short, unique, non-sequential ids from numbers.
    Ответ написан
    Комментировать
  • Чем замыкание отличается от карринга?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Даже рядом не близкие понятия. Просто в Python каррирование делается с помощью замыканий.
    Ответ написан
    2 комментария
  • Соблюдён ли полностью принцип открытости/закрытости?

    может лучше сделать универсальный класс и порождать его Engine(type='petrol')
    в зависимости от self.type уже требовать ввод каких либо параметров, как то расход топлива на 100 или потребление эл-ва в час
    Ответ написан
    2 комментария
  • Нужно ли всегда использовать try/except?

    @Fixid
    ИМХО: любые опасные операции и особенно работа с базой должны быть обернуты в try/except. Не каждой либе-прослойке можно верить что она все провалидирует как хочется
    Ответ написан
    3 комментария
  • Как заполнить таблицу тестовыми данными?

    qlkvg
    @qlkvg
    python backend developer
    Питон старый. Аннотирование типов появилось в питоне, начиная с версии 3.6.
    Ответ написан
    Комментировать