Размещение моего ответа в соответствии с рекомендациями @martineau.
result.png
на диск: from PIL import Image
from platform import system
from ctypes import string_at, Structure, c_long as cl, c_ubyte, \
py_object, pointer, POINTER as PT, CFUNCTYPE, CDLL
import requests
class GIF_WHDR(Structure): _fields_ = \
[("xdim", cl), ("ydim", cl), ("clrs", cl), ("bkgd", cl),
("tran", cl), ("intr", cl), ("mode", cl), ("frxd", cl), ("fryd", cl),
("frxo", cl), ("fryo", cl), ("time", cl), ("ifrm", cl), ("nfrm", cl),
("bptr", PT(c_ubyte)), ("cpal", PT(c_ubyte))]
def GIF_Load(lgif, file, size):
def WriteFunc(d, w):
list = d.contents.value
if (len(list) == 0):
list.append(Image.frombytes("L", (w[0].frxd, w[0].fryd),
string_at(w[0].bptr, w[0].frxd * w[0].fryd)))
list[0].putpalette(string_at(w[0].cpal, w[0].clrs * 3))
list = []
lgif.GIF_Load(file, size,
CFUNCTYPE(None, PT(py_object), PT(GIF_WHDR))(WriteFunc),
None, pointer(py_object(list)), 0)
return list
chunk = 32768
img = "wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif"
lgif = CDLL(("%s.so", "%s.dll")[system() == "Windows"] % "./gif_load")
size = -1
file = b""
response = requests.get("https://upload.wikimedia.org/" + img, stream = True)
if response.status_code != 200:
print('Error:', response.status_code)
else:
while size < len(file):
size = len(file)
file += response.raw.read(chunk)
list = GIF_Load(lgif, file, len(file))
if (len(list) == 1):
list[0].save("result.png")
break
print("Read %d bytes\n" % len(file))
Имейте в виду, что это только иллюстративный пример; он не поддерживает многие вещи, присутствующие в современных GIF-файлах, такие как чередование и прозрачность. Полностью совместимую версию см. В примере из [1].
Ну, существует много переменных, которые могли влиять на вещи. Вот некоторые причины, Отладка могла быть быстрее:
В целом я ожидал бы, что отладочная сборка будет быстрее для создания, но медленнее работать и сборка конечных версий для занимания больше времени для создания, но конечный результат работал бы быстрее.
Это до выпуска buid, вероятно, имеющий более агрессивные оптимизации, и они могут interfer с debuggability. Кроме того, некоторые оптимизации более широкого масштаба действительно занимают много времени. Время для вставки отладочной информации в объектные файлы является достаточно маленьким, чтобы быть игнорируемым, вероятно, требуется меньше времени, чем чтение исходного кода от диска во-первых.
Просто предположение, но я предположил бы, что сборка конечных версий займет больше времени в большинстве случаев из-за оптимизации.
Сборки отладки обычно быстрее, потому что нет никакой сделанной оптимизации (который очень распространен в сборках конечных версий).
Можно решить не генерировать отладочную информацию с исполняемым файлом и никакой оптимизацией также, но это было бы странно для сборки конечных версий. Хотя это создало бы быстрее, я думаю.
Основное различие между Отладкой и Выпуском - то, что Отладка предназначена для отладки (поэтому включает отладочную информацию), и Выпуск предназначен для выполнения быстрее, таким образом, Вы используете сильную оптимизацию
Сборки конечных версий основной причины будут быстрее, то, что компилятор делает большую оптимизацию на них. Например, это может развернуть циклы, удалить ненужные переменные и подставляемые функции. Оптимизация не является тривиальной задачей и берет большую вычислительную мощность, таким образом замедляя сборку.
Большинство компиляторов позволит Вам выключить оптимизацию на сборках конечных версий. Попробуйте это. Ваше время изготовления уменьшится. Можно также включить оптимизацию на сборках отладки и видеть, что время изготовления поднимается.