Для производительности особенно то, когда Вы выполняете итерации по большому спектру, 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)
, Как Вы видите при использовании в для цикла или понимания, или, где уже перенесено со списком (), диапазон оставлен без изменений.
Вы можете сделать одно из двух:
Вызвать getResources ()
и просмотреть возвращенную коллекцию URL-адресов, считывая их как манифесты, пока не найдете свой:
Перечисление resources = getClass (). GetClassLoader ()
.getResources ("МЕТА-ИНФОРМАЦИЯ / МАНИФЕСТ.MF");
while (resources.hasMoreElements ()) {
пытаться {
Манифест манифеста = новый манифест (resources.nextElement (). OpenStream ());
// проверяем, что это ваш манифест, и делаем то, что вам нужно, или получаем следующий
...
} catch (IOException E) {
// ручка
}
}
Вы можете попробовать проверить, является ли getClass (). GetClassLoader ()
экземпляром java.net.URLClassLoader
. Это большинство загрузчиков классов Sun, включая AppletClassLoader
.
Затем вы можете преобразовать его и вызвать findResource ()
, который был известен - по крайней мере, для апплетов - для непосредственного возврата необходимого манифеста:
URLClassLoader cl = (URLClassLoader) getClass (). GetClassLoader () ;
пытаться {
URL url = cl.findResource ("META-INF / MANIFEST.MF");
Манифест манифеста = новый манифест (url.openStream ());
// что-то с этим делать
...
} catch (IOException E) {
// ручка
}
Сначала вы можете найти URL-адрес вашего класса. Если это JAR, вы загружаете манифест оттуда. Например,
Class clazz = MyClass.class;
String className = clazz.getSimpleName() + ".class";
String classPath = clazz.getResource(className).toString();
if (!classPath.startsWith("jar")) {
// Class not from JAR
return;
}
String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) +
"/META-INF/MANIFEST.MF";
Manifest manifest = new Manifest(new URL(manifestPath).openStream());
Attributes attr = manifest.getMainAttributes();
String value = attr.getValue("Manifest-Version");
Я считаю, что наиболее подходящий способ получить манифест для любого пакета (включая пакет, который загрузил данный класс) - использовать объект Bundle или BundleContext.
Почему вы включаете шаг getClassLoader? Если вы скажете this.getClass (). GetResource (), вы должны получать ресурсы относительно вызывающего класса. Я никогда не использовал ClassLoader.getResource (), хотя при беглом просмотре документации Java кажется, что вы получите первый ресурс с таким именем, найденный в любом текущем пути к классам.