Попробовав решение, предложенное Желязным на относительно большом DataFrame (~ 400 тыс. строк), я нашел его очень медленным. Вот альтернатива, которую я обнаружил, чтобы быстрее выполнять заказы на моем наборе данных.
df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})
df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})
df_grouped = df_grouped.reset_index()
df_grouped = df_grouped.rename(columns={'count':'count_max'})
df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])
df = df[df['count'] == df['count_max']]
Я предпочитаю, чтобы первая версия запускала Java-приложение только потому, что у него меньше ловушек («добро пожаловать в адский путь к классу»). Второй требует исполняемого файла jar, и путь класса для этого приложения должен быть определен внутри манифестной баночки (все остальные объявления classpath будут молча игнорироваться ...). Таким образом, со второй версией вам нужно будет заглянуть в банку, прочитать манифест и попытаться выяснить, действительны ли записи классаpath, откуда хранится банка ... Этого можно избежать.
Не ожидайте каких-либо преимуществ или недостатков производительности для любой версии. Это просто говорит jvm, какой класс использовать для основного потока и где он может найти библиотеки.
При использовании java -cp
вам необходимо предоставить полное имя основного класса, например
java -cp com.mycompany.MyMain
При использовании java -jar myjar.jar
ваш файл jar должен предоставить информацию о основной класс через manifest.mf, содержащийся в файле jar в папке META-INF
:
Main-Class: com.mycompany.MyMain
Как уже говорилось, -cp - это просто указание jvm в командной строке, какой класс использовать для основного потока и где он может найти библиотеки (define classpath). В -jar он ожидает, что класс-путь и основной класс будут определены в манифесте jar-файла. Таким образом, другое - для определения вещей в командной строке, в то время как другие обнаруживают их внутри манифеста jar. Нет никакой разницы в производительности. Вы не можете использовать их одновременно, -jar переопределит -cp.
Хотя даже если вы используете -cp, он все равно проверит файл манифеста. Таким образом, вы можете определить некоторые из классов-классов в манифесте, а некоторые в командной строке. Это особенно полезно, если у вас есть зависимость от какой-либо сторонней банки, которую вы не можете предоставить своей сборке или не хотите предоставлять (ожидая, что она будет найдена уже в системе, где она должна быть установлена, например). Поэтому вы можете использовать его для обеспечения внешних банок. Это местоположение может различаться между системами или может даже иметь другую версию на другой системе (но с теми же интерфейсами). Таким образом, вы можете создать приложение с другой версией и добавить фактическую стороннюю зависимость к пути класса в командной строке при ее запуске в разных системах.
С аргументом -cp
вы предоставляете путь пути к пути к другим классам или библиотекам, которые могут потребоваться вашей программе при компиляции или запуске. С помощью -jar
вы укажете исполняемый JAR-файл, который вы хотите запустить.
Вы не можете указать их оба. Если вы попытаетесь запустить java -cp folder/myexternallibrary.jar -jar myprogram.jar
, то это не будет работать. Путь к классам для этого JAR должен быть указан в его манифесте, а не как аргумент -cp
.
Здесь вы можете найти здесь здесь и здесь .
PS: -cp
и -classpath
являются синонимами.
-cp
и -classpath
, то нет, нет никакой разницы.
– Radu Murzea
12 August 2012 в 14:59
-jar
вы указываете, какой исполняемый JAR вы хотите запустить. С помощью -cp
вы указываете пути (ы) к дополнительным классам / библиотеке, которые могут потребоваться вашей программе. 2 имеют совершенно разные цели.
– Radu Murzea
12 August 2012 в 15:22
Не будет никакой разницы в производительности. Используя java-cp, мы можем указать требуемые классы и jar в пути к классам для запуска файла класса java.
Если это исполняемый файл jar. Когда используется java -jar-команда, jvm находит класс, который должен запускаться из файла /META-INF/MANIFEST.MF внутри файла jar.
java -cp CLASSPATH необходим, если вы хотите указать весь код в пути к классам. Это полезно для отладки кода.
Яркий исполняемый формат: java -jar JarFile
можно использовать, если вы хотите запустить приложение с помощью одной короткой команды. Вы можете указать дополнительные зависимые файлы jar в вашем МАНИФЕСТЕ, используя пробельные разделители в записи класса, например :
Class-Path: mysql.jar infobus.jar acme/beans.jar
Оба они сопоставимы с точки зрения производительности.