Это, вероятно, не всегда быстрее, но более оптимистично относительно этого, Вы находите большой главный делитель:
N
Ваш номер return(N)
Sqrt(N)
N is divisible by Prime
тогда Return(Prime)
Редактирование: На шаге 3 можно использовать Решето Эратосфена или Решето Atkins или независимо от того, что Вам нравится, но отдельно решето не найдет Вас самым большим простым множителем. (Thats, почему я не выбрал бы сообщение SQLMenace's в качестве официального ответа...)
Формат gzip определяет поле с именем ISIZE
, которое:
Содержит размер исходных (несжатых) входных данных по модулю 2 ^ 32.
В gzip .py , который, как я полагаю, используется для поддержки gzip, существует метод под названием _read_eof
, определенный как таковой:
def _read_eof(self):
# We've read to the end of the file, so we have to rewind in order
# to reread the 8 bytes containing the CRC and the file size.
# We check the that the computed CRC and size of the
# uncompressed data matches the stored values. Note that the size
# stored is the true file size mod 2**32.
self.fileobj.seek(-8, 1)
crc32 = read32(self.fileobj)
isize = U32(read32(self.fileobj)) # may exceed 2GB
if U32(crc32) != U32(self.crc):
raise IOError, "CRC check failed"
elif isize != LOWU32(self.size):
raise IOError, "Incorrect length of data produced"
Здесь вы можете увидеть, что ISIZE
читается, но только для того, чтобы сравнить его с self.size
для обнаружения ошибок. Тогда это должно означать, что GzipFile. size
хранит фактический размер без сжатия. Однако я думаю, что он не раскрывается публично, поэтому вам, возможно, придется взломать его, чтобы раскрыть его. Не совсем уверен, извините.
Я только что просмотрел все это прямо сейчас и не пробовал, поэтому могу ошибаться. Я надеюсь, что это будет вам полезно. Извините, если я неправильно понял ваш вопрос.
Способ Unix: используйте "gunzip -l file.gz" через subprocess.call / os.popen, захватите и проанализируйте его вывод.
Глядя на источник модуля gzip
, я вижу, что базовый файловый объект для GzipFile
выглядит как fileobj
. Итак:
mygzipfile = gzip.GzipFile()
...
mygzipfile.fileobj.tell()
?
Может быть, перед этим было бы неплохо провести некоторую проверку работоспособности, например, проверить наличие атрибута с помощью hasattr
.
Не совсем публичный API, но ...
GzipFile.size хранит несжатый размер, но он увеличивается только при чтении файла, поэтому вам следует предпочесть len (fd.read ()) вместо закрытого GzipFile.size.