Я могу обнаружить, если мой код работает на cPython или Jython?

Идеальное решение этой проблемы работает с итераторами (а не только с последовательностями). Это также должно быть быстро.

Это решение, предоставленное документацией для itertools:

def grouper(n, iterable, fillvalue=None):
    #"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)

Используя ipython's %timeit на моем MacBook Air, я получаю 47,5 нас за цикл.

Тем не менее, это действительно не работает для меня, так как результаты дополняются до четных групп. Решение без дополнения немного сложнее. Наиболее наивное решение может быть:

def grouper(size, iterable):
    i = iter(iterable)
    while True:
        out = []
        try:
            for _ in range(size):
                out.append(i.next())
        except StopIteration:
            yield out
            break

        yield out

Простое, но довольно медленное: 693 нас за цикл

Лучшее решение, которое я мог бы найти, использует islice для внутреннего цикла:

def grouper(size, iterable):
    it = iter(iterable)
    while True:
        group = tuple(itertools.islice(it, None, size))
        if not group:
            break
        yield group

С тем же набором данных я получаю 305 нас за цикл.

Невозможно получить чистое решение быстрее, чем это, я предлагаю следующее решение с важным предостережением: если ваши входные данные содержат экземпляры filldata, вы можете получить неправильный ответ.

def grouper(n, iterable, fillvalue=None):
    #"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    for i in itertools.izip_longest(fillvalue=fillvalue, *args):
        if tuple(i)[-1] == fillvalue:
            yield tuple(v for v in i if v != fillvalue)
        else:
            yield i

Мне действительно не нравится этот ответ, но он значительно быстрее. 124 доллара США за цикл

10
задан Vasil 9 July 2009 в 12:19
поделиться

3 ответа

, если вы используете Jython

import platform
platform.system()  

, верните 'Java'
, здесь есть обсуждение , надеюсь, это поможет.

16
ответ дан 3 December 2019 в 13:14
поделиться

У вас будет уникальный файл settings.py для каждой среды.

Файл settings.py разработки не должен быть вашим QA / Test или производственным settings.py.

Что мы сделать вот что.

У нас есть "master" settings.py, который содержит установленные приложения и другие элементы, которые не сильно меняются.

У нас есть файлы для конкретной среды с именами вроде settings_dev_win32.py и settings_qa_linux2.py и 'settings_co_linux2.py` и т. д.

Каждая из этих зависящих от среды настроек импортирует «основные» настройки, а затем отменяет такие вещи, как драйвер БД. Поскольку каждый файл настроек уникален для среды, здесь нет операторов if и нет определения, в какой среде мы работаем.

Производство (в Apache, используя mod_wsgi и mysql) использует settings_prod_linux2.py ] и никакие другие.

При разработке (в Windows с использованием sqlite) используется файл settings_dev_win32.py .

3
ответ дан 3 December 2019 в 13:14
поделиться

Как указал Сунцян

import platform
platform.system()

, работает для Jython 2.5, но не работает в Jython 2.2 (предыдущий выпуск Jython). Кроме того, было некоторое обсуждение возможности возврата дополнительных деталей, специфичных для операционной системы, для подобных вызовов в Jython 3.x. Здесь ничего не решено, но для обеспечения безопасной обратной и прямой совместимости я бы предложил использовать:

import sys
sys.platform.startswith('java')

Что будет возвращать True для Jython и False везде (на самом деле в Jython 2.2 или старше он возвращает 1 для Jython и 0 везде, но это все равно будет нормально работать в операторах if и других проверках). Этот вызов работает в Jython, по крайней мере, еще до версии 2.1, и будет работать в обозримом будущем.

В версии Python 2.6 или выше (примечание, Jython 2.6 еще не выпущен) другой вариант:

import platform
platform.python_implementation

который возвращает ' CPython 'для реализации Python на языке C, IronPython для IronPython и вернет Jython для Jython. Очевидно, что эта версия не имеет обратной совместимости ниже 2.6, но будет иметь прямую совместимость.

21
ответ дан 3 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: