Python - это собранный мусором язык. Если значение больше не «доступно» из вашего кода, оно в конечном итоге будет удалено.
Оператор del
, как вы видели, удаляет привязку вашей переменной. Переменные - это не значения, они просто имена для значений.
Если эта переменная была единственной ссылкой на значение в любом месте, значение в конечном итоге будет удалено. В частности, в CPython сборщик мусора построен поверх подсчета ссылок. Таким образом, «в конечном итоге» означает «немедленно». * В других реализациях это обычно «довольно скоро».
Если бы были другие ссылки на одно и то же значение, то просто удалить одну из этих ссылок (независимо del x
, x = None
, выходя из области, где x
существует и т. д.) ничего не очищает. **
Здесь есть еще одна проблема. Я не знаю, что на самом деле измеряет модуль memory_profiler
(предположительно этот ), но описание (говорящее об использовании psutil
) звучит так, будто оно измеряет использование вашей памяти «снаружи».
Когда Python освобождает хранилище, он не всегда или даже обычно возвращает его в операционную систему. Он хранит «бесплатные списки» на нескольких уровнях, поэтому он может быстрее использовать память быстрее, чем если бы ей пришлось вернуться к ОС, чтобы попросить больше. В современных системах это редко бывает проблемой - если вам нужна память снова, хорошо, что у вас это было; если вы этого не сделаете, он будет выгружен, как только кому-то это понадобится, и его никогда не вернуть, поэтому есть немного вреда.
(Кроме того, который я называл " OS "выше - это действительно абстракция, состоящая из нескольких уровней, из библиотеки malloc
через основную библиотеку C в ядро / пейджер, и по крайней мере один из этих уровней обычно имеет свои собственные бесплатные списки.)
Если вы хотите отслеживать использование памяти с внутренней точки зрения ... ну, это довольно сложно. В Python 3.4 стало намного проще благодаря новому модулю tracemalloc
. Существуют различные сторонние модули (например, heapy
/ guppy
, Pympler
, meliae
), которые пытаются получить такую же информацию с более ранними версиями, но это сложно, потому что получение информации от разных распределителей и привязка этой информации к сборщику мусора было очень трудным до PEP 445
.
* В некоторых случаях являются ссылками на значение ... но только из других ссылок, которые сами недостижимы, возможно, в цикле. Это все еще считается «недостижимым» в отношении сборщика мусора, но не касается количества ссылок. Таким образом, у CPython также есть «детектор циклов», который работает так часто и находит циклы достижимых друг друга, но не достижимых значений, и очищает их.
** Если вы " повторное тестирование в интерактивной консоли, могут быть скрытые ссылки на ваши значения, которые трудно отслеживать, поэтому вы можете думать, что вы избавились от последней ссылки, когда вы этого не сделали. В сценарии всегда должно быть возможно , если не easy , чтобы понять, что происходит. Модуль gc
может помочь, как и отладчик. Но, конечно, оба из них также дают вам новые способы добавления дополнительных скрытых ссылок.
Вам не нужно применять дневное условие, так как ваше изображение не меняет базис в день. Это меняется во времени. Таким образом, вы можете использовать что-то вроде ниже:
$h = date('H'); // it will return hour in 24 format.
if ($h >= 4 && $h < 12) $img = 'img/s1.jpg'; //if it's between 4am and 12pm show day strength 1 image
else if ( ($h >= 12 && $h <= 23) || ($h >= 1 && $h <= 2) ) $img = 'img/c1.jpg'; //it's between 12pm and 2am show evening condition 1 image
else if ($h >= 2 && $h < 4) $img = 'img/rest.jpg'; //if it's between 2am and 4am show rest image
Вы можете вносить изменения в свои арифметические операторы в соответствии с вашими требованиями. И если ваше изображение меняется в зависимости от дня, вы можете просто добавить дату в переменную вашего изображения, как показано ниже:
$h = date('H'); // it will return hour in 24 format.
$d = date('d');
if ($h >= 4 && $h < 12) $img = 'img/s'.$d.'.jpg';
else if ( ($h >= 12 && $h <= 23) || ($h >= 1 && $h <= 2) ) $img = 'img/c'.$d.'.jpg';
else if ($h >= 2 && $h < 4) $img = 'img/rest.jpg';
Надеюсь, это поможет вам.
Попробуйте,
$h = date('G'); //set variable $h to the hour of the day
//G is the date key for hours in 24 format (not 12), with no leading 0s, like 02.
$d = date('d'); //set variable $d to the day of the month.
$DynamicDay = '21';
if ($DynamicDay == $d) {
switch ($h) {
case ($h >= 4 && $h < 12):
$img = 'img/s' . $d . '.jpg';
break;
case ($h >= 12 && $h < 14):
$img = 'img/c1.jpg';
break;
case ($h >= 14 && $h < 18):
$img = 'img/rest.jpg';
break;
default:
break;
}
}
echo 'Hour => '.$h.'<p>';
echo 'day => '.$d.'<p>';
echo $img;
die;
Out Put:
Hour => 10
day => 21
img/s21.jpg
Вместо нескольких if / else вы можете поместить все правило в массив для простоты поддержки.
$array = [
1 => [
4 => 'img/s1.jpg',
12 => 'img/s12.jpg',
14 => 'img/s14.jpg',
],
2 => [
2 => 'img/c2.jpg'
]
];
function getDayDateImage($array, $d, $h)
{
while (!$array[$d][$h]) {
$h--;
if ($h < 0) {
$h = 23;
$d--;
}
if ($d < 1) {
return 'img/rest.jpg'; // Default
}
}
return $array[$d][$h];
}
echo getDayDateImage($array, 1, 1); // Get img/rest.jpg
echo getDayDateImage($array, 1, 13); // Get img/s12.jpg
echo getDayDateImage($array, 2, 1); // Get img/s14.jpg
echo getDayDateImage($array, 2, 4); // Get img/c2.jpg
//Just pass you $d and $h
//getDayDateImage($array, $d, $h);
Надеюсь, что это поможет.