Вот вариант numpy
:
import numpy as np
_, cts = np.unique(df.values, axis=0, return_counts=True)
len(np.where(cts == 1)[0])
#2
Попробуйте FutureTask. Он не имеет явной зависимости от среды Executor и может быть создан как есть, или вы можете расширить его для его настройки.
Материал, вызываемый в будущем, основан на пуле потоков. Если вам нужно выполнять одну и ту же операцию много раз, я настоятельно рекомендую использовать пул.
Если вы не хотите использовать пул потоков, то я бы предложил использовать поток вручную. Нетрудно сделать то, что вы хотите, используя один поток и присоединяясь к нему.
class X extends Thread {
MyObject result;
public void run() {
// .. do the operation here. Set result
}
public MyObject getResult() {
// This will block until the thread is complete
join();
return result;
}
}
Чтобы выполнить этот вызов:
X x = new X();
x.start();
в конечном итоге вы вызовете getResult, который будет блокировать до завершения потока X:
x.getResult();
Хорошо, вы можете довольно легко написать вспомогательный метод:
public static Future<T> createFuture(Callable<T> callable)
{
ExecutorService service = Executors.newSingleThreadExecutor();
Future<T> ret = service.submit(callable);
// Let the thread die when the callable has finished
service.shutdown();
return ret;
}
РЕДАКТИРОВАТЬ: Чтобы расширить ответ alphazero , вы будете использовать FutureTask
как это:
FutureTask<MyObject> future = new FutureTask<MyObject>(myCallable);
new Thread(future).start(); // FutureTask implements Runnable
// Now use the future however you want
И да, я бы сказал, что это лучше, чем мой первый ответ:)