星期三, 4月 11, 2018

Django 節省記憶體的一些紀錄

前一陣子在改寫程式,避免使用過多記憶體時的一些紀錄。

pympler


pympler 很好用,主要是用來察看記憶體用量。缺點是得自己安插 code 觀看,之後再移掉。文件裡有不少用法,我只用到兩種。
第1種用法是 asizeof.asizeof(obj) ,這可以看物件使用的記憶體用量。

from pympler import asizeof
obj = {'foo': 'bar'}
print(asizeof.asizeof(obj))
第2種用法是 summary/muppy,這可以察看一段程序執行後的記憶體差異。

from pympler import summary, muppy
sum1 = summary.summarize(muppy.get_objects())
# do works
sum2 = summary.summarize(muppy.get_objects())
diff = summary.get_diff(sum1, sum2)
summary.print_(diff)
# 要輸出到 logging 的話,可以用 format_ 或 _format_table
# for line in summary.format_(diff):
#   logger.debug(line)
這段根據文件也可以使用 tracker.SummaryTracker() 來代替。
參考資料:

yield / generator

函式如果要傳回大量的資料,使用 yield ,這可以避免佔用大量記憶體,只有在 iterate 時,才一次一次拿回來。

def foo():
  for i in range(100000000):
    yield i  # 這讓 foo 的傳回結果變成 generator 物件

for x in foo():
  print(x)

Django Queryset

可以的話,儘量使用 values() 跟 values_list() 並指定所需的欄位,除了可以提升速度之外,也減少記憶體用量。
values() 是將記錄作為一個 dict 傳回,而 values_list() 則是將紀錄作為一個 tuple 傳回。這樣可以省去還原為 Django model object 的程序,因此速度會更快,記憶體使用的更少。而使用 values_list() 比 values() 來的更省,這是因為 tuple 所佔用的記憶體比 dict 來的少。

星期三, 3月 28, 2018

Using jinja2 as django template engine

Django 1.8 以後已經可以選擇使用自家的 template engine 或是使用 jina2 template engine 了,而且是可以混用,不限制你只能使用其中一種。
第一步是先安裝 jinja2:
pip install jinja2
第二步是在 settings 裡的 TEMPLATES 裡增加 jinja2 的設定:
TEMPLATES = [
    # 省略 django template 的設定
    {
        'NAME': 'jinja2',
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [
            # insert more TEMPLATE_DIRS here
            # join(BASE_DIR, 'templates'), 
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'your_project.jinja2.environment',
        },
    },
]

第三步,是在 your_project 下建立 jinja2.py ,內容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import    # 使用 absolute_import 很重要!!!
import logging
from django.utils import translation
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
import jinja2


logger = logging.getLogger(__name__)


def environment(**options):
    env = jinja2.Environment(
        extensions=['jinja2.ext.i18n', 'jinja2.ext.with_'],
        **options)
    env.globals.update({
        'static': staticfiles_storage.url,
        'url': reverse,
    })
    env.install_gettext_translations(translation)    # 使用 django 的 i18n/l10n
    return env
在這裡,我遇到一個奇怪的狀況,python 2 一直告訴我 jinja2 沒有 Environment,後來看了這篇,才知道是 absolute/relative import 問題,使用 absolute_import 以確保 import 的 jinja2 是正確的,而不是 django 的 jinja2。我想,python 3 應該不會有這問題。
django template 是使用 load 載入模組,jinja2 則需要在 Environment 初始化時就定義。
第四步,是在繼承 TemplateView 的類別裡,加入
template_engine = 'jinja2'
,然後在 your_app 下建立 jinja2 路徑,將 template 檔案放在那裡即可。

class Jinja2Test(TemplateView):
    template_name = 'jinja2test.html'  # template file 的名稱是 jinja2test.html ,檔案必須放在 your_app/jinja2 下。
    template_engine = 'jinja2'  # 表示要使用 jinja2 template engine,這個 jinja2 是定義在 settings 裡的 NAME

    def get_context_data(self, **kwargs):
        ctx = super(Jinja2Test, self).get_context_data(**kwargs)
        ctx['foo'] = 'bar'
        ctx['hello'] = 'world'
        return ctx
參考資料:

星期二, 3月 27, 2018

電影流水帳(2018/1/9~2018/2/20)

一下就過了一個月...
Gal GadotGal Gadot ,在蝙蝠俠大戰超人裡飾演神力女超人 (Wonder woman),在大戰時幫蝙蝠俠擋住致命一擊的一幕真的是太有戲劇性了。
  • Geostorm (IMDB, Wikipedia),台譯:氣象戰。譯名會讓人誤導故事的內容,原本以為是不當的利用科學而導致地球浩劫,實際上是純粹政治權謀的操作。
    哥哥帶領著世界的團隊開發了可以控制地球氣候的衛星系統,可是在完成的時候,被高層以弟弟換掉了。時間很快過了三年,哥哥並沒有因為時間而把這事情放下。就在這時,這個氣候系統讓地球的氣候發生了異常,都查不出所以然,只好派出當初的開發者哥哥上太空去調查。經過一連串的事情跟調查,哥哥發現可能是總統為了大位而作的,就請在地球的弟弟去作進一步的查證。弟弟在查證以後,發現其實是國務卿的陰謀,經過一番的打鬥,終於逮捕了國務卿,讓一切恢復正常。
    我覺得很有趣的一段是弟弟跟未婚妻探員保護總統逃走的過程,他們在車上閒聊的時候,總統知道這勇敢的探員是弟弟女友時,直喊你一定要娶她。我忘了詳細的對話,但這段真的蠻有趣的。
  • Logan (IMDB, Wikipedia),台譯:羅根。風格跟之前的金鋼狼故事完全不同,走出截然不同的故事,我滿喜歡的。
    羅根年紀大了,帶著同樣也老了的 X 教授跟 Caliban 一起生活,他靠著開車載客來賺取生活費用。有一天,有個人來叫車,羅根到了那兒,發現是個女人要他送個女孩-蘿拉去邊境,羅根不肯。但後來那女人死了,羅根只得帶著蘿拉回去,跟 X 教授商量怎麼作。X 教授發現蘿拉是個變種人,羅根不太相信,可是過了沒多久,就有某個生物科技公司前來索討蘿拉。羅根不肯,帶著 X 教授逃走,生物科技公司因為 Caliban 有追蹤的能力,就強逼他去追蹤羅根、X 教授跟蘿拉。在逃亡的途中,慢慢帶出羅根為什麼帶著 X 教授的事情以及蘿拉的經歷。蘿拉是生物科技公司利用羅根的基因所複製、改造出來的,逃出公司的還有其他孩子,同樣也是以變種人的基因改造出來的。
    後來三人在路上遇到農夫,被農夫一家邀請吃晚餐,並借宿一晚。X 教授睡了很好的一覺後,以為羅根回來了,就帶著懺悔的心情娓娓道出他其實明白自己害死了其他 X 戰警的事情,可是這個羅根是複製品,就這樣被複製的羅根給殺死。羅根之後帶著哀慟送蘿拉到了邊境,見到這些孩子,孩子們打算隔天就越境到加拿大去。羅根不打算跟著他們,跟蘿拉告別,但在護送蘿拉到這裡的過程裡,他心裡原本悲觀的想法有點改變了。隔天,孩子們早早就啟程離開,但羅根發現生物科技公司緊追不捨,已經展開大規模的追捕。他趕過去,透過藥物的幫忙,幫助孩子們對抗生物科技公司的追捕,經過一番大戰以後,成功的阻止生物科技公司,讓孩子們順利的越境,可是自己的生命也走到了終點。
  • Ghost in the shell (IMDB, Wikipedia),台譯:攻殼機動隊。之前有看過一部份動畫,這陣子剛好 HBO 有上映,就看了。
    素子是個改造人,由阪華機械進行改造,她忘了過去的事情,只記得現在在公安九課協助追捕罪犯。在追捕一個犯人的過程中,她慢慢找回了自己的過去,知道了阪華機械公司的醜陋事情。在公安九課以及改造她的科學家的幫助下,打倒了阪華機械,大概就這樣。
    基本上我覺得故事本身而言不算改動太大,選角也能接受,比較讓我不能接受的是可愛的 Tachikoma 攻殼車變得太不可愛了。
  • Fantastic Beasts and Where to Find Them (IMDB, Wikipedia),台譯:怪獸與他們的產地。延續哈利波特的風格,沒看過原著,但表現中規中矩,不難看。不過我覺得女主角的妹妹還蠻搶戲的,滿喜歡她。
    Newt 來到美國要讓一個奇獸回到原生地,結果卻捲入連續的殺人事件裡,甚至還被冤枉。但最後水落石出,找出真正的凶手,並且解決事件。
  • The boss baby (IMDB, Wikipedia),台譯:寶貝老闆。故事的設定相當有趣,嬰兒是統一由寶貝公司派去想要孩子的家庭,但是公司上層發現嬰兒的需求數愈來愈低。在調查之後,發現市場是被狗狗公司所侵佔,於是為了奪回市佔,寶貝公司派出特務到狗狗公司員工的家庭裡進行調查。狗狗公司員工的家庭裡有個小男孩,但這個小男孩發現了特務是個成熟的嬰兒的事情,在事情曝光之下,這個嬰兒跟這個小男孩在不打不相識之後,為了相同的目的,決定攜手合作。在調查之後,他們發現狗狗公司即將發表一個新產品,於是他們打算在狗狗公司新產品發表會時,將新產品搶走。孰料卻中了狗狗公司總裁的計謀,狗狗公司的總裁原來是寶貝公司的厲害人物,但卻被裁掉,變成了大人,他懷恨在心,就處心積慮的研發新產品打擊寶貝公司。這次的新產品就是藉助寶貝特務的奶瓶,來讓狗狗不會長大。眼看任務就要失敗,兩人相互打氣,展開行動,聯手阻止產品發表會,順利解決。最後,寶貝特務還是到了小男孩的家庭裡,當了他的弟弟。
  • Batman v Superman: Dawn of Justice (IMDB, Wikipedia),台譯:蝙蝠俠大戰超人-正義曙光。因為超人鋼鐵英雄故事裡的大戰,布魯斯·韋恩(就超人啦~)不太開心,積極的找對付超人的方法。在這段期間,雷克斯·路瑟也推波助瀾地讓他們相互誤解。到了最後,雷克斯·路瑟在無法讓超人跟蝙蝠俠相互內鬨的情況下,利用氪星的科技,復活了薩德將軍,讓薩德將軍去打擊蝙蝠俠跟超人,在大戰之中,之前布魯斯·韋恩意外發現的女超人也加入混戰。混戰的最後,超人拿了蝙蝠俠所打造的氪星長矛殺死了變種的薩德將軍,自己也壯烈犧牲。在超人的葬禮上,女超人問了蝙蝠俠哲學的問題,蝙蝠俠感佩超人的人格,表示會再去找其他的英雄一起來保衛世界,埋下正義聯盟的伏筆。
  • 奇門遁甲 (IMDB, Wikipedia)。似乎是要向以前的「奇門遁甲」致敬,我是忘了之前的故事是什麼,不過故事看起來並沒有相關。電影的特效是還不錯,不過故事就乏善可陳,電影的結尾看起來是還有續集,唉~
    故事圍繞在霧隱門上,霧隱門是個神祕的門派,以特殊的武功與技藝保護著一個被封印起來的妖怪,並秘密尋找未來的掌門人與御神機。在因緣巧合之下,一個捕快介入了,被封印的妖怪被另外一個妖怪救了出來,天下開始大亂。霧隱門的二師兄在此時找到未來的掌門人小圓,回來霧隱門跟眾人展開行動。而老大則找到了御神機,跟武林其他門派一同搶奪,妖怪在此現身,說明了他的陰謀,拿回御神機的同時,也將加入爭奪的門派掌門人收為己用。在過程裡,霧隱門人發現了小圓有著神奇的能力,並且與妖怪展開鬥爭,最後在小圓的威能協助之下,打敗了妖怪。但事情還沒了結,還有故事沒交代完。

星期二, 3月 20, 2018

如何客製 Django package 的 locale?

在 Django 裡使用了某個 package,但該 package 沒有自己所用的 locale 時,該怎麼做呢?
以下以 django-mptt 為例:
  1. 先確認 site-packages 下 django-mptt 的目錄名稱,在安裝 django-mptt 以後,實際上是 mptt,所以在專案目錄下建立 mptt/locale 。
  2. 到 site-packages/mptt 下,執行 django-admin makemessages --locale=zh_TW
  3. 將 site-packages/mptt/locale/zh_TW 搬移到專案目錄下的 mptt/locale
  4. 使用 poedit 或其他工具進行翻譯
  5. 調整 django settings 裡的 LOCALE_PATHS,例如:
    from os.path import dirname, join
    BASE_DIR = dirname(dirname(dirname(__file__)))
    # ...略...
    LOCALE_PATHS = [
        join(BASE_DIR, 'locale'),
    
        # customize translations which package is in site-packages
        join(BASE_DIR, 'mptt', 'locale'),
    ]
    
這樣就大功告成了。

星期六, 1月 13, 2018

電影流水帳(2018/1/1~2018/1/8)

轉眼間就 2018 年啦~趁元旦假期,看了不少電影。
Amber Heard Wallpaper
Amber Heard,在 3 Days to kill 裡飾演 CIA 的高級長官,在戲裡相當搶眼,但是導演給這個角色的描寫實在薄弱,讓 Amber Heard 淪為一個花瓶角色。
    • San Andreas (IMDB, Wikipedia),台譯:加州大地震。蠻適合打發時間的災難片,再加上飾演 Blake 的 Alexandra Daddario 真的很漂亮,令人賞心悅目。另外就是飾演 Ben 的 Hugo Johnstone ,去年剛好有看「費雪小姐探案集」,所以也認識這個人,他在探案集裡演的是憨直的警察,跟費雪小姐的女僕是一對,看來他也來好萊塢發展了呢。
      故事線主要有三個,第一條是進行長期監測並進行研究的地質學家 Lawrence 跟他的伙伴找到了一個地震指標,並且根據這個指標與來訪的記者配合,發佈了預警消息,讓更多人能提早避難。第二條是 Dwayne Johneson 飾演的救難隊員 Ray,試圖與妻子復合,在地震發生以後,救了妻子 Emma,然後一起到舊金山去救女兒,想當然爾,他們兩人在援救過程中打開心結,救到女兒後就復合了。第三條是女兒 Blake 跟 Emma 的男友一同去舊金山,認識了來應徵的 Ben,在地震發生後,Ben 跟他的弟弟救了 Blake,然後一同逃難,最終被 Ray 救到。
    • Spider-Man: Homecoming (IMDB, Wikipedia),台譯:蜘蛛人-返校日。這部電影是我第一次上 Google play 租借來看的電影,看完以後,覺得一片好評不是沒原因的。
      出完美國隊長3的任務以後,Peter 一直想要再次被重用,所以一直自己出任務,並且跟 Happy 報告,但是 Happy 跟 Tony 都沒怎麼理他。Peter 在一次事件發現不良份子都有強大的外星武器,他感到很奇怪,循線追查到 Vulture,並且報告了 Happy,但是得到一樣的結果,於是他自己行動追捕,卻弄巧成拙,被 Tony 訓斥了一番,失去了蜘蛛裝。一方面,Peter 在好友面前意外曝了光,洩漏了蜘蛛人的祕密,在學校裡得到了 Liz 的好感,跟 Liz 一同去參加學校舞會。在去舞會的途中,卻發現 Liz 的父親就是 Vulture ,Vulture 給了 Peter 台階下,可是 Peter 基於正義感,決定不顧 Liz 要維護正義,就阻止 Vulture 去搶 Tony 要運走的武器。兩人打了一場,Peter 總算是阻止了 Vulture,並且獲得 Tony 的肯定。
      Peter 的同學 Michelle 的戲份不多,但是給的幾場戲都隱隱讓人覺得她很特別,並且在下集應該會有很多空間,就期待吧。
    • The Man from U.N.C.L.E. (IMDB, Wikipedia),台譯:紳士密令。說是改編自早期的影集,故事的轉折效果不錯,還蠻好看的。
      Solo 去東德出了任務救出 Gaby,在過程裡遇到強勁的對手 - Ilya。Solo 在救出 Gaby 後,卻被高層指定要跟 Ilya 聯手,一同去找 Gaby 的叔叔 Rudy,要套出 Gaby 父親的下落,以避免 Gaby 父親被利用去開發核子武器。這三人一同去了義大利出任務,任務的過程裡發生了蠻多事,三人開始惺惺相惜。到了最後,卻發現 Gaby 是英國特務,三方聯手,找到 Gaby 父親,並且攔截了核子武器。本來 Ilya 為了磁碟打算要動手對付 Solo ,豈知畫面一轉,兩人將磁碟燒掉,握手言和,這時高層也下了指令,要三人組隊,繼續其他任務。
      照這結局看來應該是還會有結局,不過屈指算算也快三年了,或許沒下文了。
    • Passengers (IMDB, Wikipedia),台譯:星際過客。去年看網路評價普普,但自己看過比較實在,我覺得還不錯。
      Jim 是個 Maker ,參加了星際墾荒團,跟著一群人要到遙遠的星球定居,但不知為什麼 Jim 在半路脫離了冬眠狀態醒了過來。他試著要重回冬眠狀態,但沒辦法,只好一個人孤獨的活著。過了一年,一個女人 Aurora 醒了過來,Aurora 相當的驚訝,但在 Jim 的陪伴下接受了這個事實。兩人一起生活了一陣子,開始有了情愫,Jim 都準備要求婚了。但就在這個時候,酒保機器人洩漏了 Jim 的祕密,原來 Aurora 是被 Jim 喚醒的。Aurora 非常非常的驚訝與忿怒,她不能諒解為什麼 Jim 要這樣做,讓她的一生就只能在太空旅行度過。他們冷戰了好一陣子,直到艦長也醒了過來,艦長直覺判定這艘船出了差錯,於是協同 Jim 跟 Aurora 兩人尋找故障的機組,但找到一半,艦長的身體已經不行了,艦長交代他們兩人要好好合作,找到故障機組,拯救這個墾荒團。Jim 跟 Aurora 費了一番功夫終於找到故障的機組,也進行了更換,但是由於排出閥門故障,必須由外部介入才能打開,可是這樣有很大的風險。於是 Jim 決定試試看,好不容易把握時間到了閥門,卻發現閥門故障,必須有人一直按著開關才行,Jim 決定犧牲自己。Aurora 配合 Jim 的指示按下開關進行排出,Jim 非常幸運的沒有被燒死,但卻被氣流衝出去。Aurora 趕緊換上太空衣,在千鈞一髮的時刻救回 Jim,送到醫療機器去救援,Jim 非常幸運的被救活。兩人繼續生活,Jim 在某天向 Aurora 求婚,並告訴她,在看過醫療機器的說明書以後,知道可以讓 Aurora 繼續冬眠。Aurora 做了決定,說已經找到這一生最愛的人,不願意再冬眠,陪著 Jim 在太空旅行度過。墾荒團最後到了目的地,看到 Aurora 留下的紀錄。
    • 3 Days to kill (IMDB, Wikipedia),台譯:特務殺很大。導演試圖在老套的冷血殺戮裡帶入父親 Ethan 對妻女的親情,效果還不錯,最後 Ethan 選擇了對妻子忠誠,不再繼續任務。可惜的是,Vivi 雖然搶眼,但實質的戲份並不多,淪為花瓶。
      Vivi 收到指令,參與暗殺任務,Ethan 也在暗殺任務裡,但任務並沒有成功。Ethan 早就知道自己來日不多,於是在任務結束後,交代好遺囑,打算把剩下的時間留給妻女,但跟 Vivi 會面後,得知自己可以透過稀有的標靶藥再多一點時間,就答應了 Vivi 繼續暗殺任務。在任務的過程裡,他一邊照顧就讀高中的女兒,一邊幫 Vivi 出任務。在任務時,他認識了幫 Wolf 開車的駕駛,透過他,多了解了女兒更多。最後在參加女兒男友的舞會時,遇到 Wolf,展開一場大戰,後來拼的幾近兩敗俱傷時,Vivi 出現,要 Ethan 幹掉 Wolf,但 Ethan 不肯,暈了過去。片尾 Ethan 一家團聚過聖誕,Vivi 在遠方看著他們。
    • LEGO DC Comics SuperHeroes: Justice league - Gotham city breakout (IMDB, Wikipedia),台譯:樂高電影正義聯盟-高譚市突圍。在邊準備煮紅豆湯的過程裡回想,在把紅豆放入電鍋後,終於想起來故事,這是樂高的 DC 英雄系列電影。
      正義聯盟的超級英雄們想讓蝙蝠俠放個長假,於是給了蝙蝠俠一個驚喜,並且講好讓超人代替蝙蝠俠守護高譚市。可是,小丑等幾個反派實在是出乎超人意料之外,超人雖然有羅賓跟神力女超人等的幫忙,還是節節敗退。
      蝙蝠俠跟夜鷹、蝙蝠女一起去了之前的師傅那兒,卻發現師傅是冒充的,調查以後發現是班恩跟蝙蝠俠之前的同學進入了師傅守護的地底大坑裡,利用該地底種族的寶石控制了該地底種族,並囚禁了師傅。蝙蝠俠、夜鷹跟蝙蝠女後來也被關了,遇到了師傅跟王子,幾個人協力打破牢籠,經過一番打鬥,讓蝙蝠俠之前的同學捐棄成見,一同打敗班恩,讓該地底種族重獲自由。
      在高譚市的超人、羅賓等人呼叫了正義聯盟的其他人,並且以羅賓的經驗為基礎,打敗了小丑等反派,讓高譚市回復正常。 蝙蝠俠一行人回到高譚市,超人坦白了自己太過輕敵,蝙蝠俠看到一切都正常,就不多說什麼,眾人開心的慶祝。

您或許對這些文章有興趣

Related Posts Plugin for WordPress, Blogger...