Идеальное решение этой проблемы работает с итераторами (а не только с последовательностями). Это также должно быть быстро.
Это решение, предоставленное документацией для 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 доллара США за цикл
, если вы используете Jython
import platform
platform.system()
, верните 'Java'
, здесь есть обсуждение , надеюсь, это поможет.
У вас будет уникальный файл 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
.
Как указал Сунцян
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, но будет иметь прямую совместимость.