Реализация формулы шнурка может быть выполнена в Numpy
. Предполагая эти вершины:
import numpy as np
x = np.arange(0,1,0.001)
y = np.sqrt(1-x**2)
Мы можем переопределить функцию в numpy, чтобы найти область:
def PolyArea(x,y):
return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1)))
И получить результаты:
print PolyArea(x,y)
# 0.26353377782163534
Избегать for
цикл делает эту функцию примерно в 50 раз быстрее, чем PolygonArea
:
%timeit PolyArea(x,y)
# 10000 loops, best of 3: 42 µs per loop
%timeit PolygonArea(zip(x,y))
# 100 loops, best of 3: 2.09 ms per loop.
Время выполняется в блокноте Jupyter.
Использовать таблицу переименования
RENAME TABLE old_table TO backup_table, new_table TO old_table;
Она атомарна, работает на всех механизмах хранения и не требует перестраивания индексов.
В MySQL из-за поведения TRUNCATE я думаю, вам потребуется:
BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT TRANSACTION;
Я не уверен, что есть способ сделать то, что всегда эффективно безопасная транзакция операции DDL.
Вы можете использовать транзакции (для InnoDB
),
BEGIN TRANSACTION;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
COMMIT;
или ТАБЛИЦЫ БЛОКИРОВКИ
(для MyISAM
):
LOCK TABLES;
DELETE FROM SCORES;
INSERT INTO SCORES SELECT * FROM SCORES_TEMP;
UNLOCK TABLES;
Я не знаю, как MySQL работает с транзакциями, но в T-SQL вы можете написать
BEGIN TRAN
DELETE FROM SCORES
INSERT INTO SCORES SELECT * FROM SCORES_TEMP
COMMIT TRAN
Таким образом, ваша операция будет "атомарной", но не мгновенной.