Тесты всякого в питоне
Что быстрее f = open() или with open()
Время выполнения этих двух фрагментов кода будет примерно одинаковым, поскольку оба выполняют одну и ту же базовую операцию записи в файл. Основное различие между ними заключается в том, как они управляют файлом.
В первом случае, вы используете конструкцию with, которая автоматически закрывает файл после выхода из блока кода. Это обеспечивает корректное закрытие файла даже в случае возникновения исключений внутри блока with.
Во втором случае, вы вручную открываете и закрываете файл. Если в этом коде возникнет исключение перед f.close(), файл может остаться открытым.
Поэтому, хотя время выполнения обоих фрагментов кода будет примерно одинаковым, рекомендуется использовать конструкцию with для работы с файлами из-за ее большей надежности.
Что быстрее???
def generate_link_file_in_memory(filename, num_links):
links = (f'https://www.example.com/{"".join(random.choices(string.ascii_letters + string.digits, k=10))}\n' for _ in
range(num_links))
with open(filename, 'w') as f:
f.writelines(links)
def generate_link_file(filename, num_links):
with open(filename, 'w') as f:
for _ in range(num_links):
random_path = ''.join(random.choices(string.ascii_letters + string.digits, k=10))
f.write(f'https://www.example.com/{random_path}\n')
Время выполнения этих двух функций может слегка различаться, но эти различия вряд ли будут значительными, поскольку оба варианта выполняют по сути ту же операцию: запись определенного числа ссылок в файл.
В первой функции generate_link_file_in_memory используется генератор, который создает ссылки “на лету” при записи в файл. Генераторы в Python являются “ленивыми” - они генерируют значения по мере необходимости, что может быть более эффективным при работе с большими объемами данных.
Вторая функция generate_link_file генерирует и записывает каждую ссылку по очереди в цикле for. Это может быть немного медленнее, если число ссылок (num_links) очень велико, поскольку каждая операция записи вызывает системный вызов на уровне операционной системы.
В общем, различия в производительности этих двух функций вряд ли будут значительными для большинства приложений. Оптимальный выбор между ними может зависеть от конкретных требований к вашему приложению.
Что быстрее???
Сначала создать список и записать его в файл ИЛИ создавать строчки и сразу записывать их в файл
КОД
import timeit
# Отступ между ссылками
offset = 55
def generate_link_file(filename, num_links):
start_time = timeit.default_timer()
with open(f"link/{filename}", 'w') as f:
for i in range(num_links):
f.write(f'{i}\n')
time = timeit.default_timer() - start_time
print(f"Время создания файла |{filename}|:".ljust(offset) + f" {time} секунд")
def generate_link_file_in_memory(filename, num_links):
start_time = timeit.default_timer()
lines = '\n'.join(str(i) for i in range(num_links))
with open(f"link/{filename}", 'w') as f:
f.write(lines)
time = timeit.default_timer() - start_time
print(f"Время создания файла |{filename}|:".ljust(offset) + f" {time} секунд")
lines_nums = 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000
for lines_num in lines_nums:
print(f"Количество ссылок - {lines_num}")
generate_link_file(f'links_{lines_num}.txt', lines_num)
generate_link_file_in_memory(f'links_memory_{lines_num}.txt', lines_num)
print("-" * 100)
Результаты
Количество ссылок - 10
Время создания файла |links_10.txt|: 0.000251375000061671 секунд
Время создания файла |links_memory_10.txt|: 0.00011733399969671154 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 100
Время создания файла |links_100.txt|: 0.0001435420003872423 секунд
Время создания файла |links_memory_100.txt|: 0.00010437499986437615 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 1000
Время создания файла |links_1000.txt|: 0.0002949160002572171 секунд
Время создания файла |links_memory_1000.txt|: 0.00020495799981290475 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 10000
Время создания файла |links_10000.txt|: 0.0014938750000510481 секунд
Время создания файла |links_memory_10000.txt|: 0.001325665999956982 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 100000
Время создания файла |links_100000.txt|: 0.01093045900006473 секунд
Время создания файла |links_memory_100000.txt|: 0.00972183399971982 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 1000000
Время создания файла |links_1000000.txt|: 0.09775554199995895 секунд
Время создания файла |links_memory_1000000.txt|: 0.11356541699979061 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 10000000
Время создания файла |links_10000000.txt|: 0.9605139169998438 секунд
Время создания файла |links_memory_10000000.txt|: 1.004641540999728 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 100000000
Время создания файла |links_100000000.txt|: 9.297923832999913 секунд
Время создания файла |links_memory_100000000.txt|: 14.835841707999862 секунд
----------------------------------------------------------------------------------------------------
Количество ссылок - 1000000000
Время создания файла |links_1000000000.txt|: 94.62288816699993 секунд
Время создания файла |links_memory_1000000000.txt|: Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
Код выхода 137 означает, что процесс был убит из-за использования слишком много системной памяти или был вручную убит
через команду. Сигнал 9, SIGKILL, не может быть перехвачен, заблокирован или проигнорирован, что означает, что это
надежный способ завершить процесс.
Это часто происходит из-за:
Ситуация Out of Memory (OOM): Ваша программа попыталась использовать больше памяти, чем могла предоставить система.