Каков лучший веб-видимый формат для сохранения TIF с 1 битовой глубиной?

Мне было интересно узнать о производительности различных подходов, и вот оно:

Проверено на Python 3.5.1

import time
batch_size = 7
arr_len = 298937

#---------slice-------------

print("\r\nslice")
start = time.time()
arr = [i for i in range(0, arr_len)]
while True:
    if not arr:
        break

    tmp = arr[0:batch_size]
    arr = arr[batch_size:-1]
print(time.time() - start)

#-----------index-----------

print("\r\nindex")
arr = [i for i in range(0, arr_len)]
start = time.time()
for i in range(0, round(len(arr) / batch_size + 1)):
    tmp = arr[batch_size * i : batch_size * (i + 1)]
print(time.time() - start)

#----------batches 1------------

def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]

print("\r\nbatches 1")
arr = [i for i in range(0, arr_len)]
start = time.time()
for x in batch(arr, batch_size):
    tmp = x
print(time.time() - start)

#----------batches 2------------

from itertools import islice, chain

def batch(iterable, size):
    sourceiter = iter(iterable)
    while True:
        batchiter = islice(sourceiter, size)
        yield chain([next(batchiter)], batchiter)


print("\r\nbatches 2")
arr = [i for i in range(0, arr_len)]
start = time.time()
for x in batch(arr, batch_size):
    tmp = x
print(time.time() - start)

#---------chunks-------------
def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]
print("\r\nchunks")
arr = [i for i in range(0, arr_len)]
start = time.time()
for x in chunks(arr, batch_size):
    tmp = x
print(time.time() - start)

#-----------grouper-----------

from itertools import zip_longest # for Python 3.x
#from six.moves import zip_longest # for both (uses the six compat library)

def grouper(iterable, n, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

arr = [i for i in range(0, arr_len)]
print("\r\ngrouper")
start = time.time()
for x in grouper(arr, batch_size):
    tmp = x
print(time.time() - start)

Результаты:

slice
31.18285083770752

index
0.02184295654296875

batches 1
0.03503894805908203

batches 2
0.22681021690368652

chunks
0.019841909408569336

grouper
0.006506919860839844
5
задан Kelsey 31 March 2015 в 15:51
поделиться

3 ответа

PNG, безусловно, ваш лучший выбор.

Причина, по которой ваш PNG оказывается больше, чем исходный TIF, может заключаться в том, что среда выполнения не выполняет все сжатие возможно. Если вам действительно нужно сжать каждый последний маленький байт из файла PNG, я бы предложил использовать такой инструмент, как AdvancePNG или OptiPNG , чтобы сжать PNG после их записи. Автор OptiPNG написал хорошую статью со ссылками на несколько других оптимизаторов PNG .

6
ответ дан 14 December 2019 в 01:15
поделиться

Используйте PNG, он поддерживает 1-битный цветовой режим и работает даже в IE4 (если вам не нужна частичная прозрачность). Ваши клиенты используют IE3?

2
ответ дан 14 December 2019 в 01:15
поделиться

Несколько лет назад я, возможно, избегал PNG, но сейчас он просто работает. и существует множество сценариев взлома, чтобы заставить его работать с IE 5 и 6, так что вы можете быть в безопасности для большинства пользователей. Если вам действительно нужна совместимость, предложите как GIF, так и PNG.

1
ответ дан 14 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: