Вы всегда должны отдавать предпочтение xrange (), а не range ()?

Вы можете создать коллекцию строк с такими ключами, как это (я предполагаю, что ваши ключи имеют тип int):

var id1id2Strings = listOfIds.Select(p => p.Id1+ "-" + p.Id2);

Затем вы можете просто использовать «Содержит» на вашем db:

using (dbEntities context = new dbEntities())
            {
                var rec = await context.Table1.Where(entity => id1id2Strings .Contains(entity.Id1+ "-" + entity.Id2));
                return rec.ToList();
            }
455
задан mbac32768 26 September 2008 в 05:24
поделиться

7 ответов

Для производительности особенно то, когда Вы выполняете итерации по большому спектру, xrange(), обычно лучше. Однако существует все еще несколько случаев, почему Вы могли бы предпочесть range():

  • В python 3, range() делает то, что xrange() раньше делал, и xrange() не существует. Если Вы хотите написать код, который будет работать и на Python 2 и на Python 3, Вы не можете использовать xrange().

  • range() может на самом деле быть быстрее в некоторых случаях - например, при итерации по той же последовательности многократно. xrange() должен восстановить целочисленный объект, что каждый раз, но range() будет иметь реальные целочисленные объекты. (Это будет всегда работать хуже с точки зрения памяти однако)

  • xrange(), не применимо во всех случаях, где реальный список необходим. Например, это не поддерживает части или любые методы списка.

[Редактирование] Там несколько сообщений, упоминающих, как range() будет обновлен 2to3 инструмент. Для записи вот вывод выполнения инструмента на некоторых демонстрационных использованиях [1 112] и xrange()

RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@

 for x in range(20):
-    a=range(20)
+    a=list(range(20))
     b=list(range(20))
     c=[x for x in range(20)]
     d=(x for x in range(20))
-    e=xrange(20)
+    e=range(20)

, Как Вы видите при использовании в для цикла или понимания, или, где уже перенесено со списком (), диапазон оставлен без изменений.

440
ответ дан Bonifacio2 26 September 2008 в 05:24
поделиться

Необходимо одобрить range() более чем xrange() только при необходимости в фактическом списке. Например, когда Вы хотите изменить список, возвращенный range(), или когда Вы хотите нарезать его. Для повторения или даже просто нормальной индексации, xrange() будет хорошо работать (и обычно намного более эффективно). Существует точка, где range() немного быстрее, чем xrange() для очень маленьких списков, но в зависимости от Ваших аппаратных средств и различных других деталей, безызбыточность может быть в результате длины 1 или 2; не что-то для волнения о. Предпочтите xrange().

42
ответ дан Stefan van den Akker 26 September 2008 в 05:24
поделиться

xrange() более эффективно, потому что вместо того, чтобы генерировать список объектов, это просто генерирует один объект за один раз. Вместо 100 целых чисел, и всех их издержек и списка, чтобы вставить их, у Вас просто есть одно целое число за один раз. Более быстрое поколение, лучшее использование памяти, более эффективный код.

, Если мне конкретно не нужен список для чего-то, я всегда одобряю xrange()

13
ответ дан Dan Udey 26 September 2008 в 05:24
поделиться
  • 1
    Это не отличается, но ответы в вот от нескольких объединенных вопросов, таким образом, не все ответы существовали, когда я ответил. – Brent Stewart 18 January 2013 в 16:08

Пойдите с диапазоном по этим причинам:

1) xrange будет уходить в более новых версиях Python. Это дает Вам легкую будущую совместимость.

2) диапазон возьмет эффективность, связанную с xrange.

3
ответ дан torial 26 September 2008 в 05:24
поделиться

диапазон () возвращает список, xrange () возвращает объект xrange.

xrange () немного быстрее, и немного больше эффективной памяти. Но усиление не является очень большим.

дополнительная память, используемая списком, конечно, только потрачена впустую, списки имеют больше функциональности (часть, повторите, вставьте...). Точные различия могут быть найдены в документация . Нет никакого правила bonehard, используйте то, что необходимо.

Python 3.0 находится все еще в разработке, но диапазон IIRC () будет очень похожий на xrange () 2. X и список (диапазон ()) может использоваться для генерации списков.

8
ответ дан jschultz 26 September 2008 в 05:24
поделиться
  • 1
    Моя ошибка, there' s никакой бесконечный цикл. Однако, как упомянуто в одном из другие ответы , it' s лучше к ping что-то не только однажды, и использование -w Timeout опция для разового задержкой в миллисекундах, а не -n Count опция целого числа повторений. – martineau 28 January 2013 в 17:25

Хорошо, все здесь как различное мнение относительно компромиссов и преимуществ xrange по сравнению с диапазоном. Они главным образом корректны, xrange является итератором, и диапазон излагает в деталях и создает фактический список. Для большинства случаев Вы действительно не заметите различия между двумя. (Можно использовать карту с диапазоном, но не с xrange, но это израсходовало больше памяти.)

, Что я думаю, что Вы сплачиваетесь, хотят услышать, однако, то, что предпочтительным вариантом является xrange. Так как диапазон в Python 3 является итератором, инструмент преобразования кода 2to3 правильно преобразует все использование xrange для расположения и выведет ошибку или предупреждение для использования диапазона. Если Вы захотите убедиться легко преобразовать свой код в будущем, то Вы будете использовать xrange только и список (xrange), когда Вы будете уверены, что хотите список. Я изучил это во время спринта CPython в PyCon в этом году (2008) в Чикаго.

2
ответ дан Douglas Mayle 26 September 2008 в 05:24
поделиться
  • 1
    Хотя короче, это - дубликат принятого ответа. – Peter Mortensen 15 August 2012 в 07:00

Нет, у них обоих есть свое использование:

Использование xrange() при итерации, поскольку это сохраняет память. Скажите:

for x in xrange(1, one_zillion):

, а не:

for x in range(1, one_zillion):

, С другой стороны, используйте range(), если Вы на самом деле хотите список чисел.

multiples_of_seven = range(7,100,7)
print "Multiples of seven < 100: ", multiples_of_seven
129
ответ дан Dan Lenski 26 September 2008 в 05:24
поделиться
  • 1
    По-видимому эта команда только доступна в Windows 7/2008 и Наборе Ресурса XP (и возможно 8/8.1). Источник также требует ping, подход использует меньше процессорного времени. – martineau 4 June 2014 в 04:25
Другие вопросы по тегам:

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