Как получить время выполнения запроса на шифр из python?
Я пытаюсь сравнить время выполнения запроса Cypher от python, то есть время, необходимое для вычисления на neo4j-сервере (не включая время, необходимое для вывода результата). Прямо сейчас я использую следующий код:
from neo4j.v1 import
driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', '1234'))
n_repeats = 3
cypher = "MATCH (a) -[:{}*]- (b) WHERE ID(a) < ID(b) RETURN DISTINCT a, b".format(graphname + '_edges')
with driver.session() as session:
total_time = 0
for _ in range(n_repeats):
with session.begin_transaction() as tx:
start = time.time()
tx.run(cypher)
total_time += time.time() - start
avg_time = total_time*1000 / n_repeats
print('Average execution time:', avg_time, 'ms')
Есть ли лучший способ рассчитать время выполнения запроса шифра? Например, в postgresql есть оператор EXPLAIN ANALYZE, который также предоставляет время, необходимое для выполнения запроса SQL. В Cypher есть операторы EXPLAIN и PROFILE, но, похоже, оба не возвращают определенное время.
Я использую neo4j-драйвер для подключения к neo4j прямо сейчас, но я бы хотел перейти на другую библиотеку.
1 ответ
На самом деле, затраченное время доступно во всех результатах без профилирования. Они находятся в сводке результата, и время выполнения делится на время до тех пор, пока какой-либо поток результатов не станет доступен, и время, пока весь поток результатов не будет использован сервером.
Их можно сложить вместе, чтобы получить общее время выполнения запроса, выраженное в миллисекундах:
result = tx.run(query, params)
avail = result.summary().result_available_after
cons = result.summary().result_consumed_after
total_time = avail + cons
Драйвер Neo4j Python 1.7
from neo4j.v1 import
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
n_repeats = 3
cypher = "MATCH (a) -[:{}*]- (b) WHERE ID(a) < ID(b) RETURN DISTINCT a, b".format(graphname + '_edges')
with driver.session() as session:
total_time = 0
for _ in range(n_repeats):
with session.begin_transaction() as tx:
start = time.time()
result = tx.run(cypher)
records = list(result) # consume the records
tx.commit()
total_time += time.time() - start
avg_time = total_time*1000 / n_repeats
print('Average execution time:', avg_time, 'ms')