С помощью Java 8 вы можете сделать что-то подобное с помощью всех обычных методов:
Object returnValue = TimeIt.printTime(() -> methodeWithReturnValue());
//do stuff with your returnValue
с TimeIt like:
public class TimeIt {
public static <T> T printTime(Callable<T> task) {
T call = null;
try {
long startTime = System.currentTimeMillis();
call = task.call();
System.out.print((System.currentTimeMillis() - startTime) / 1000d + "s");
} catch (Exception e) {
//...
}
return call;
}
}
С помощью этого метода вы можете легко провести время измерения в любом месте вашего кода, не нарушая его. В этом простом примере я просто распечатываю время. Можно добавить переключатель для TimeIt, например. чтобы печатать только время в DebugMode или что-то в этом роде.
Если вы работаете с Function, вы можете сделать что-то вроде этого:
Function<Integer, Integer> yourFunction= (n) -> {
return IntStream.range(0, n).reduce(0, (a, b) -> a + b);
};
Integer returnValue = TimeIt.printTime2(yourFunction).apply(10000);
//do stuff with your returnValue
public static <T, R> Function<T, R> printTime2(Function<T, R> task) {
return (t) -> {
long startTime = System.currentTimeMillis();
R apply = task.apply(t);
System.out.print((System.currentTimeMillis() - startTime) / 1000d
+ "s");
return apply;
};
}
Вы проверили опцию "chunksize" для фрейма данных? Он используется для разбиения больших наборов данных на более мелкие, если они не помещаются в память - вот хорошее объяснение, где они хотят прочитать данные 10G + в кадр данных: http://acepor.github.io/2017/ 08/03 / с использованием-chunksize / .
Вы можете попробовать приведенный ниже код, но я думаю, что вам нужно, чтобы read_csv сначала работал для вашего конкретного формата файла, и выяснил имена / номера столбцов. Вы также можете настроить размер куска; чем больше, тем быстрее. Это все равно будет идти медленно, так как это вложенный цикл.
import pandas as pd
import numpy as np
outfile = 'tab1_tab2_match.dat'
df1 = pd.read_csv('tab1.dat', encoding='ascii', chunksize=1)
col1 = 0
col1_1 = 1
col2 = 0
col2_1 = 1
writeheader= True
mode = 'w'
for cm in df1:
df2 = pd.read_csv('tab2.dat', encoding='ascii', chunksize=100000)
for chunk in df2:
chunk.columns = ['col2', 'col2_1' ]
chunk['del1'] = np.abs(chunk.iloc[:, col1] - cm.iloc[0, col1_1])
chunk['del2'] = np.abs(chunk.iloc[:, col2] - cm.iloc[0, col2_1])
chunk['dist'] = np.sqrt((chunk['del1'] * np.cos(chunk['del2'])) ** 2 + chunk['del2'] ** 2)
tmp = chunk[chunk['dist'] <= 0.00008333]
tmp['col1', 'col1_2'] = cm.iloc[0, [col1, col1_1]]
tmp = tmp ['']
tmp['col2', 'col2_1', 'col1', 'col2_1'].to_csv(outfile, mode=mode, header=writeheader)
mode = 'a'
writeheader = False
Производительность, вот в чем проблема с циклами и Python. Я предлагаю вам изменить свой метод. У вас есть два входных кадра данных: -table (col1 col2) -table1 (col1_1 col2_1)
Вы хотите вычесть col1 с col1_1, col2 с col2_1 и сравнить значения с порогом d и добавить 4 столбца внутри выходной фрейм данных.
Вот метод без зацикливания, и панды
import pandas as pd
table = pd.DataFrame(data= {'col1': [1, 2,3,4,5], 'col2': [6,7,8,9,10]})
table1 = pd.DataFrame(data= {'col1_1': [0.5, 0.2,0.3,0.9,0.9], 'col2_1': [5.1,5.2,4.5,5.4,8.5]})
print(table)
print(table1)
col1 col2
0 1 6
1 2 7
2 3 8
3 4 9
4 5 10
col1_1 col2_1
0 0.5 5.1
1 0.2 5.2
2 0.3 4.5
3 0.9 5.4
4 0.9 8.5
## 1. Join the 2 tables
join = table.join(table1)
print(join)
col1 col2 col1_1 col2_1
0 1 6 0.5 5.1
1 2 7 0.2 5.2
2 3 8 0.3 4.5
3 4 9 0.9 5.4
4 5 10 0.9 8.5
## 2. create a new columns with substraction
join["del1"] = abs(join['col1'] - join['col1_1'])
join["del2"] = abs(join['col2'] - join['col2_1'])
print(join)
col1 col2 col1_1 col2_1 del1 del2
0 1 6 0.5 5.1 0.5 0.9
1 2 7 0.2 5.2 1.8 1.8
2 3 8 0.3 4.5 2.7 3.5
3 4 9 0.9 5.4 3.1 3.6
4 5 10 0.9 8.5 4.1 1.5
## 3. filter with threshold
d = 2
final_df = join[(join.del1 < d) & (join.del2 <d)]
print(final_df)
col1 col2 col1_1 col2_1 del1 del2
0 1 6 0.5 5.1 0.5 0.9
1 2 7 0.2 5.2 1.8 1.8