Это зависит от длины данных, но здесь для небольших данных (365 строк) быстрее понимание списка:
In [108]: %timeit (ser.apply(lambda x: isinstance(x, pd.Timestamp)))
434 µs ± 57.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [109]: %timeit ([isinstance(x, pd.Timestamp) for x in ser])
140 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [110]: %timeit (pd.to_datetime(ser, errors='coerce').notna())
1.01 ms ± 25.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Но если тестировать больший DataFrame, то он быстрее to_datetime
с проверить не пропущенные значения по Series.isna
:
ser = pd.Series(pd.date_range('1980/01/05', '2020/01/05'))
ser.loc[3] = 4
print (len(ser))
14611
In [116]: %timeit (ser.apply(lambda x: isinstance(x, pd.Timestamp)))
6.42 ms ± 541 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [117]: %timeit ([isinstance(x, pd.Timestamp) for x in ser])
4.9 ms ± 256 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [118]: %timeit (pd.to_datetime(ser, errors='coerce').notna())
4.22 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
В примере переписывания Дэна Удей есть две опечатки (и я не могу это прокомментировать), это должно быть :
RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]
Regards.
.Я сделал бы это другим способом.
проблемы: 1. Наличие PHP раздают файлы, менее эффективно, чем это могло быть. 2. PHP должен проверить существование файлов каждый раз, когда изображение требуют 3. Apache намного лучше в этом, чем PHP когда-либо будет.
здесь существует несколько решений.
можно использовать mod_rewrite
на Apache. Возможно использовать mod_rewrite для тестирования, чтобы видеть, существует ли файл, и если так, служите тому файлу вместо этого. Это обходит PHP полностью и делает вещи намного быстрее. Реальный способ сделать это, тем не менее, должно было бы генерировать определенную схему URL, которая должна всегда существовать и затем перенаправлять к PHP если нет.
, Например:
RewriteCond %{REQUEST_URI} ^/images/cached/
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule (.*) /images/generate.php?$1 [L]
Поэтому, если клиент запрашивает /images/cached/<something>
и тот файл, уже не существует, Apache перенаправит запрос к /images/generate.php?/images/cached/<something>
. Этот сценарий может затем генерировать изображение, записать это в кэш и затем отправить его клиенту. В будущем Сценарий PHP никогда не называют за исключением новых изображений.
кэширование Использования. Как другой сказанный плакат, используйте вещи как mod_expires
, Измененные в последний раз заголовки, и т.д. для ответа на условное выражение ПОЛУЧАЮТ запросы. Если клиент не должен повторно запрашивать изображения, загрузки страницы ускорятся существенно и загрузятся на сервере, уменьшится.
Для случаев, куда действительно необходимо отправить изображение от PHP, можно использовать mod_xsendfile
, чтобы сделать это с меньше служебным. См. превосходное сообщение в блоге от Arnold Daniels по проблеме, но обратите внимание, что его пример для загрузок. Для обслуживания встроенных изображений выньте заголовок Довольного Расположения (третий заголовок () вызов).
Hope это помогает - больше после того, как моя мигрень разрешит.
Одно примечание, которое стоит добавить, должно удостовериться, что Вы - код, не генерирует "несанкционированные" размеры этих изображений.
Таким образом, следующий URL создаст 200x200 версия изображения 1234, если Вы не будете уже существовать. Я высоко предложил бы, чтобы Вы удостоверились, что требуемый URL содержит размеры изображения, которые Вы поддерживаете.
/images/get/200x200/1234.jpg
Злонамеренный человек мог начать запрашивать случайные URL, всегда изменяя высоту и ширину изображения. Это вызвало бы Ваш сервер некоторые серьезные проблемы b/c, он будет находиться там, по существу под ударом, генерируя изображения размеров, которые Вы не поддерживаете.
/images/get/0x1/1234.jpg
/images/get/0x2/1234.jpg
...
/images/get/0x9999999/1234.jpg
/images/get/1x1/1234.jpg
...
etc
Вот случайный надрез кода, иллюстрирующего это:
<?php
$pathOnDisk = getImageDiskPath($_SERVER['REQUEST_URI']);
if(file_exists($pathOnDisk)) {
// send header with image mime type
echo file_get_contents($pathOnDisk);
exit;
} else {
$matches = array();
$ok = preg_match(
'/\/images\/get\/(\d+)x(\d+)\/(\w+)\.jpg/',
$_SERVER['REQUEST_URI'], $matches);
if(! $ok) {
// invalid url
handleInvalidRequest();
} else {
list(, $width, $height, $guid) = $matches;
// you should do this!
if(isSupportedSize($width, $height)) {
// size is supported. all good
// generate the resized image, save it & output it
} else {
// invalid size requested!!!
handleInvalidRequest();
}
}
}
// snip
function handleInvalidRequest() {
// do something w/ invalid request
// show a default graphic, log it etc
}
?>
Ваш подход кажется довольно разумным - я добавил бы, что некоторый механизм должен быть помещен в место, чтобы проверить, что дата, кэшированная версия была сгенерирована, была после последней измененной метки времени оригинала (источник) файл изображения и если не повторно создают, кэшировал/изменял размер версию. Это гарантирует, что, если изображение изменяется разработчиками, кэш будет обновлен соответственно.
Кажется большим сообщением, но моя проблема все еще остается нерешенной. У меня нет доступа к htaccess в моем поставщике хоста, таким образом, никакой вопрос апачской тонкой настройки. Существует ли действительно способ установить заголовок cace-управления для изображений?
Мне удалось сделать это просто использование заголовка перенаправления в PHP:
if (!file_exists($filename)) {
// *** Insert code that generates image ***
// Content type
header('Content-type: image/jpeg');
// Output
readfile($filename);
} else {
// Redirect
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = $filename;
header("Location: http://$host$uri/$extra");
}
Это походит на твердый способ сделать это. Следующий шаг может быть должен пойти вне PHP/MySQL.
, Возможно, настраивают Ваши заголовки :
при использовании PHP для отправки типов MIME, Вы могли бы также использовать 'Активный' и заголовки 'управления Кэша', чтобы расширить жизнь Ваших изображений на сервере и снять часть загрузки PHP/MySQL.
кроме того, рассмотрите апачский плагин (плагины) для кэширования также. Как mod_expires.
, О, еще одна вещь, сколько контроля Вы имеете над своим сервером? Мы должны ограничить этот разговор всего PHP/MySQL?
phpThumb является платформой, которая генерирует измененные изображения/миниатюры на лету. Это также реализует кэширование, и очень легко реализовать.
код для изменения размеров изображения:
<img src="/phpThumb.php?src=/path/to/image.jpg&w=200&h=200" alt="thumbnail"/>
даст Вам миниатюру 200 x 200;
Это также поддерживает создание водяных знаков.
Проверяют его в: http://phpthumb.sourceforge.net/
Вместо того, чтобы хранить адрес файла в базе данных, я предпочитаю добавлять случайное число к имени файла всякий раз, когда пользователь входит в систему. Примерно так для пользователя 1234: image / picture_1234.png? Rnd = 6534122341
Если пользователь отправляет новое изображение во время сеанса, я просто обновляю случайное число.
GUID решает проблему с кешем на 100%. Однако это как бы затрудняет отслеживание файлов изображений. При использовании этого метода есть вероятность, что пользователь снова увидит то же изображение при следующем входе в систему. Однако шансы невелики, если вы сгенерируете случайное число из миллиарда чисел.