Ответы пользователя по тегу Python
  • Вывести output в один столбец на python?

    @nirvimel
    Если я правильно понял вопрос, то проблема только в форматированном выводе.
    print '\n'.join(('%s;%s' % (key, value) for key, value in grades.most_common()))
    Ответ написан
    2 комментария
  • Используются ли все зависимые библиотеки при импорте в Python?

    @nirvimel
    В Python импорт полностью динамический и происходит в runtime. Можно написать:
    if moon_phase == 42:
          import sqlalchemy

    Тогда ImportError будет вылетать при определенной фазе луны.
    Зависимости пакетов в setuptools к этому отношения не имеют.

    Что касается best practice, то абстракция от ORM или любого другого уровня часто реализуется так:
    • Общий функционал, не зависящий от реализации, выносится в ядро, которое оформляется отдельным пакетом mylibrary_core.
    • Связи с конкретной реализацией оформляются в виде плагинов в отдельных пакетах (mylibrary_django, например).
    • Каждый такой плагин имеет зависимость к ядру и к конкретной реализации (django, например).
    • Конечный юзер начинает установку сразу с mylibrary_django, который автоматом подтягивает mylibrary_core, о котором юзеру беспокоится не приходится.
    Ответ написан
    4 комментария
  • Как выполнить действие после yield?

    @nirvimel
    try:
        while condition:
            yield something
    finally:
        db.close()

    И замените это
    except:
        continue
    на
    except StandardError:
        continue
    Ответ написан
    4 комментария
  • Почему не выполняется запрос с выдачей прав?

    @nirvimel
    Узнать подробности об ошибке можно, например, так:
    try:
        self.cursor.execute('GRANT SELECT, INSERT ON TABLE log_fields TO manager;')
    except psycopg2.Error as e:
        print(e.pgerror)
        print(e.diag.message_primary)
        print(psycopg2.errorcodes.lookup(e.pgcode))
    Ответ написан
    1 комментарий
  • Почему Python multiprocessing нестабилен?

    @nirvimel
    Хорошо, что вы указали в тегах Windows, это все объясняет. Под Windows нет простого способа "раздвоиться" процессу при вызове multiprocessing.Process, поэтому осуществляется очень сложная эмуляция этого поведения. При этом функция target выдирается из модуля, запускается в отдельном интерпретаторе, а все параметры сереализуются передаются и десереализуются перед вызовом target, при этом инициализация модуля в новом интерпретаторе выполняется частично (инициализируется только глобальный контекс). Подробнее об этом, например, тут, есть еще одна очень хорошая статья где подробно рассмотрен этот механизм, но сейчас не найду ссылку.

    Коротко о том, как готовить multiprocessing под Windows:
    1. Разделять процессы (вызов multiprocessing.Process()) как можно раньше в коде.
    2. По возможности избегать инициализации любых ресурсов и глобальных переменных до разделения. Учитывайте, что этот код выполняется во всех процессах независимо и может давать кучу сторонних эффектов.
    3. Не передавать через args никаких сложных объектов с "поведением" (кроме объектов из самого multiprocessing, он сам знает как их правильно передавать), только голые данные (примитивы или объекты состоящие только из примитивов), которые сериализуются без сторонних эффектов.
    4. Создавать дочерние процессы один раз, и на протяжении всего времени работать с ними посредством обмена сообщениями через Pipe/Queue. Не порождать новые процессы в цикле вычислений в момент "когда понадобятся".
    5. Queue при попытке записи/чтения может блокировать процесс, если при этом происходит запись/чтения в/из нее в другом процессе. (Думаю, именно это и происходит в коде в вопросе).
    6. Лучше использовать Pipe, который в худшем случае блокирует один процесс, а не все, как Queue.
    7. При создании процесса можно передавать ему два Pipe (input одного + output другого), в вызывающем процессе хранить соответствующие им коннекторы и только при помощи их общаться с дочерним процессом.
    8. Можно не делать process.join(), а просто читать результаты из output Pipe, они прочтутся только после того как попадут туда, что дальше будет происходить с процессом уже не важно (можно поставить return после записи в Pipe в дочернем процессе).
    Ответ написан
    4 комментария
  • Как сделать random с неравномерным распределением в Python?

    @nirvimel
    Сделал справочную таблицу по функциям модуля random, которые генерируют значения с заданным вероятностным распределением.

    ФункцияВероятностное распределение
    random.uniform(a, b)Uniform distribution
    (Непрерывное равномерное распределение)
    random.triangular(low, high, mode)Triangular distribution
    random.betavariate(alpha, beta)Beta distribution
    (Бета-распределение)
    random.expovariate(lambd)Exponential distribution
    (Экспоненциальное распределение)
    random.gammavariate(alpha, beta)Gamma distribution
    (Гамма-распределение)
    random.gauss(mu, sigma)
    random.normalvariate(mu, sigma)
    Normal distribution
    (Нормальное распределение)
    random.lognormvariate(mu, sigma)Log-normal distribution
    (Логнормальное распределение)
    random.vonmisesvariate(mu, kappa)Von_Mises_distribution
    random.paretovariate(alpha)Pareto distribution
    (Распределение Парето)
    random.weibullvariate(alpha, beta)Weibull distribution
    (Распределение Вейбулла)


    Что касается вопроса, то, в зависимости от формы графика, которой вы добиваетесь, вам может подойти одно из этих:
    1. random.triangular(0., 1., 0.)
    2. random.expovariate(1.) (параметр lambd характеризует "наклон" графика, значение 1. выбрано произвольно)
    3. math.fabs(random.gauss(0., 1.)) (параметр sigma характеризует "наклон" графика, значение 1. выбрано произвольно)
    Ответ написан
    Комментировать
  • Как объяснить разную скорость выполнения вложенных циклов в разных языках?

    @nirvimel
    Меня как-то не устроило то, как вы оценили производительность Python, поэтому я взялся чуть подправить ваш пример для демонстрации совершенно других результатов. Запуск моего примера кроме установки numpy (pip install numpy), потребует установку еще одной интересной библиотеки (pip install numba) с ее установкой могут быть связанны некоторые трудности на различных ОС (она зависит еще и от llvm), но, поверьте, оно того стоит, полученные цифры производительности должны вам понравиться.
    Для демонстрации реальной скорости вычислений в моем примере миллион итераций это довольно мало, камень не успевает хорошо прогреться. Обратите внимание, я заменил миллион итераций на 100 миллионов, поэтому полученный результат надо разделить на 100 для сравнения с другими языками. Вот, собственно, сам код:
    from numba import jit
    import numpy
    
    
    @jit
    def inner_func(a_list, b_list):
        sum = 0
        j = 0
        for y in range(0, 16):
            for x in range(0, 16):
                p = a_list[j] - b_list[j]
                sum += p * p
                j += 1
        return sum
    
    
    @jit
    def outer_func(a_list, b_list):
        sum = 0
        for g in range(0, 100000000):  # 100 000 000 == 10^8 !!!
            sum += inner_func(a_list, b_list)
        return sum
    
    
    def main():
        maxint = numpy.iinfo(numpy.intc).max
        a_list = numpy.random.randint(maxint, size=256)
        b_list = numpy.random.randint(maxint, size=256)
        sum = outer_func(a_list, b_list)
        print(sum)
    
    
    if __name__ == '__main__':
        main()

    Если вам удалось это запустить и полученные цифры вас впечатлили, то я бы попросил подправить в вашем вопросе ту часть, которая касается Python, для восстановления справедливости в отношении этого великолепного языка.
    Ответ написан
  • Как правильно печатать unicode символы в файл на питоне?

    @nirvimel
    with open(path, 'w+') as f:
          f.write(json.dumps(data, indent=2, ensure_ascii=False).encode('utf-8'))
    Ответ написан
    2 комментария
  • Так у чего производительность выше и вероятность успешного завершения проекта у node.js или Python?

    @nirvimel
    Для того чтобы дать квалифицированный и обоснованный ответ по всем пунктам надо быть как минимум ПМ с опытом подобного рода крупных проектов на обоих языках и стеках технологий. Каждый такой проект растягивается на годы, вероятность того что ПМу за свою карьеру посчастливится руководить крупными проектами на обоих стеках существует, но не высокая. Еще меньше вероятность что такой ПМ сидит на Тостере 1 января. Так что мое мнение и мнение других, здесь присутствующих, программистов следует понимать как мнение каменщиков о смете на строительство дворца. То есть все это полное ИМХО, заангажированное в сторону знакомых по опыту технологий. И все же постараюсь ответить объективно на сколько возможно.

    1. Цена вопроса разработки.

    Больше зависит от работы по подбору кадров. В целом средняя ставка оплаты кодера на node и на python примерно равная, чуть выше чем php, но ниже чем java, c++ и др. нескипторые языки.

    2. Цена серверов.

    Обратно пропорциональна производительности. Ни node, ни python не налагают никаких особых требований, влияющих на цену серверов.

    3. Вероятность успешного завершения проекта.

    Полностью зависит от подбора команды и лично от ПМ. Точно так же с любыми другими технологиями.

    4. Производительность.

    Сейчас тут кто-то обязательно упомянет про V8, как решающий аргумент в ползу node. V8, конечно, шедевр в своем роде, но не все так однозначно, потому что на python (в отличии от js) не принято писать критичные по производительности участки на самом скрипте (подробно это этом я уже писал: На чем писать back-end, в котором много математики? ).

    5. Маштабируемость.

    Зависит от архитектуры приложения. Построение легко масштабируемых решений возможно на обоих технологиях.

    6. Отказоустойчивость.

    Сильно зависит от архитектуры приложения и от выбора инструментов (фреймворков, библиотек). Построение отказоустойчивых систем возможно на обоих технологиях.
    Ответ написан
    1 комментарий
  • Публичные базы с описанием уязвимостей?

    @nirvimel
    Лента уязвимостей: www.securitylab.ru/vulnerability (там же есть подписка).
    Лента + база + хороший поиск: www.rapid7.com/db/modules
    Ответ написан
    Комментировать
  • Ошибка при работе с dll (NameError: name 'WinDLL' is not defined) как это побороть?

    @nirvimel
    Дело в том, что ctypes, которая занимается подгрузкой динамических библиотек, не полностью кроссплатформенная. Как говорит документация, функция WinDLL существует только в ctypes под Windows. Из Python под Linux вы не сможете загрузить динамическую библиотеку, скомпилированную под Windows.
    Ответ написан
    6 комментариев
  • Отфильтровать шум в данных?

    @nirvimel
    Для этого существует Фильтр Калмана.

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

    Фильтр Калмана — это, наверное, самый популярный алгоритм фильтрации, используемый во многих областях науки и техники. Благодаря своей простоте и эффективности его можно встретить в GPS-приемниках, обработчиках показаний датчиков, при реализации систем управления и т.д.

    Последняя цитата отсюда. А эта статья окончательно снимает все вопросы.
    Ответ написан
  • Что почитать чтобы научиться писать на Python 3 сразу правильно?

    @nirvimel
    Мне в свое время понравился Марк Лутц в плане идиоматичности.
    Еще в последнее время много хвалят Майкла Доусона.
    Ответ написан
    4 комментария
  • Python как убрать сообщение при открытие браузер через модуль webbrowser?

    @nirvimel
    Если был запрошен ввод из консоли, то консоль будет ожидать ввода до тех пор пока не будет нажат Enter, и не важно что в этот момент сыплется в консоль из других потоков. Это, конечно, сбивает с толку, но не влияет на ввод. Можно спокойно продолжать набирать текст, не обращая внимания на всю эту грязь, на ввод попадет только то что введено с клавиатуры. Но если хочется сделать как-то по-эстетичнее, то можно дождаться вывода, выдержать паузу, перевести строку и читать raw_input:
    import time
    webbrowser.open_new(self.url)
    time.sleep(2)  # можете сами подобрать это значение
    print("\n")
    self.code = raw_input("Code: ")
    Ответ написан
    Комментировать
  • Глобальный импорт модулей в Python?

    @nirvimel
    Python не PHP. А глобальное пространство имен не помойка. Каждое имя должно попадать в глобальное пространство явным образом: либо через определение функции/класса, либо через импорт конкретного имени в заголовке этого же модуля, а не где-то в совершенно другом месте. Чтобы взглянув только на заголовок можно было сразу понять на что опирается и от чего зависит этот модуль. Чтобы вызов format_c() выбрасывал ошибку, если вы не писали никакой функции format_c, вместо того чтобы тихо вызывать где-то случайно заимпортированную os.low_level.dangerous.format_c

    Но для любителей помоек существует вариант понаимпортировать в отдельный модуль разные имена отовсюду, а в остальных модулях заменить всю секцию импорта на ничего не говорящую строку:
    from miscellaneous_imports_module import *
    Ответ написан
    1 комментарий
  • Как найти количество вхождений слова в тексте веб-страницы с помощью Python 3?

    @nirvimel
    from collections import Counter
    import re
    
    from lxml.html import fromstring
    from lxml.html.clean import Cleaner
    import requests
    
    
    def extract_text(node):
        """
        Extract text without markup from node
        """
    
        def extract_text_gen(node):
            if node.text:
                yield node.text.strip()
            for child in node.iterchildren():
                yield from extract_text_gen(child)
                if child.tail:
                    yield child.tail.strip()
    
        return ' '.join((s for s in extract_text_gen(node) if s))
    
    
    def count_words(text):
        return Counter((s for s in re.split(r'\s', text) if s))
    
    
    html = requests.get('https://toster.ru/q/276749').content.decode('utf-8')
    root = fromstring(html)
    Cleaner()(root)
    text = extract_text(root.body)
    words_count = count_words(extract_text(root))
    
    print('\n'.join(('"%s": %i' % (word, count) for word, count in words_count.most_common())))

    Функция extract_text взята из одного моего проекта, слегка адаптирована и упрощена.
    Ответ написан
    3 комментария
  • Можно ли писать server-side на нескольких языках одновременно?

    @nirvimel
    Это имеет смысл только если у вас в проекте на скриптовом языке есть критичный по производительности участок кода, который скрипт не тянет, и вам нужно переписать этот кусок на компилируемом языке чтобы скомпилировать в нативный код.

    Для этого используются комбинации: Python+Cython, Python+C/C++.
    Про Python+Go в продакшн я пока не слышал, но из того что я знаю о Go, если от способен компилироваться и работать на скоростях Си, то такая комбинация имеет смысл.

    Если да, то объясните, как это будет выглядеть и что для этого нужно.

    Со стороны Go - экспорт библиотечных функций в формате, позволяющем вызывать их из Си-кода (не знаю как это практически делается на Go или у него все экспортируемые функции имеют нативный формат вызова).
    Со стороны Python - написание биндинга через cffi. Только отладка такого самописного биндинга - большое приключение. При малейшей ошибке в описании интерфейса начнутся очень странные падения с segfault, ИЧХ иногда не в момент вызова а в произвольный момент после завершения вызова. Поэтому интерфейс надо стараться делать максимально компактным и прозрачным.
    Ответ написан
    Комментировать
  • Как правильно получить PID процесса в скрипте?

    @nirvimel
    from subprocess import check_output
    def get_pid(name):
        return map(int, check_output(["pidof", name]).split())

    Возвращает список pid-ов, соответствующих данному имени.
    Ответ написан
  • Как спарсить raw html страницы?

    @nirvimel
    Ответ написан
    Комментировать
  • Python парсинг сайта (характеристики)?

    @nirvimel
    from urllib.request import urlopen # for Python 3
    # from urllib2 import urlopen  # for Python 2
    
    from lxml.etree import XMLSyntaxError
    from lxml.html import fromstring
    from pandas import DataFrame, ExcelWriter
    
    URL = 'http://www.tinko.ru/c-3.html?limit=100&no_cache=true&p=l'
    ITEM_PATH = ' .info-block .product-name'
    DESCR_PATH = '.breadcrumb .active'
    
    HARET_PATH = '#techdata li'
    
    
    def parse_courses():
        f = urlopen(URL)
        list_html = f.read().decode('utf-8')
        list_doc = fromstring(list_html)
    
        df = DataFrame(columns=('name', 'description', 'href'))
    
        for elem in list_doc.cssselect(ITEM_PATH):
            a = elem.cssselect('a')[0]
            href = a.get('href')
            name = a.text
    
            details_html = urlopen(href).read().decode('utf-8')
    
            try:
                details_doc = fromstring(details_html)
            except XMLSyntaxError:
                continue
    
            description = details_doc.cssselect(DESCR_PATH)[0].text_content()
    
            haret_elems_list = [('name', name), ('description', description), ('href', href)]
    
            for haret_elems in details_doc.cssselect(HARET_PATH):
                spans = haret_elems.cssselect('span')
                title = spans[0].text_content()
                bower = spans[1].text_content()
                haret_elems_list.append((title, bower))
    
            df = df.append(dict(haret_elems_list), ignore_index=True)
    
        writer = ExcelWriter('tinko_ru_price_list.xlsx', engine='xlsxwriter')
        df.to_excel(writer, sheet_name='tinko.ru price list', header=True, index=False)
        writer.save()
    
    
    def main():
        parse_courses()
    
    
    if __name__ == '__main__':
        main()

    Вот вам готовый парсер tinko.ru с выгрузкой в Excel (проверял только в offline на странице с диска).
    Как теперь гонорар делить будем? ;)

    UPD: Подправлено.
    Ответ написан
    8 комментариев