Python cho người Việt

Python cho người Việt

Archive for October 2011

Câu chuyện tối ưu hóa đoạn mã Python

written by Nguyễn Thành Nam, on Oct 26, 2011 9:21:36 AM.

Trên trang blog của Dropbox ngày hôm qua có chia sẻ kinh nghiệm của họ trong việc tối ưu hóa một đoạn mã Python ngắn.

http://tech.dropbox.com/?p=89

Kết luận của họ là:

  1. Các kỹ thuật căn bản như inline hàm (inline function), tự lặp (implicit loop), tận dụng mã C đều đúng.
  2. Cấu trúc setdict trong Python rất nhanh.
  3. Việc sử dụng biến nội bộ thay cho toàn cục mặc dù có ích, nhưng không nhiều.
  4. Ghép chuỗi (string concatenation) nhanh hơn nhiều so với định dạng chuỗi (string interpolation).

Đây là một bài chia sẻ rất hay.

Hình ảnh tại Software Freedom Day 2010

written by Nguyễn Thành Nam, on Oct 24, 2011 7:50:31 AM.

Hôm nay tự nhiên thấy trên máy có mấy tấm hình cũ ở Ngày Phần Mềm Tự Do 2010 vẫn chưa được đăng.

Năm 2010, thành viên Phan Đắc Anh Huy đã trình bày về phần mềm Vithon Forum (chính là phần mềm được sử dụng để làm Diễn đàn của nhóm PCNV). Sau đây là các tấm hình chụp hôm đó.

img20100918104740.th.jpg img20100918104748.th.jpg img20100918104833.th.jpg

Điều kiện ánh sáng tuy không được tốt nhưng cũng phần nào thể hiện được cái đầu du côn và thân hình phì lũ của Huy.

Kết quả cuộc thi Đời

written by vithon, on Oct 21, 2011 5:51:00 PM.

Cuộc thi Đời kết thúc vào tuần trước nhưng vì không có điều kiện truy cập Internet nên đến bây giờ ban tổ chức mới có thể công bố kết quả.

Cuộc thi thu hút bốn bài tham dự từ các bạn sau:

Tác giảBài tham dự
Nhâm Xuân Namlife.py
Huỳnh Hải Âubilife.py
Phan Phụng Tiếntreeoflife.py
Vũ Khuêcuocthidoi.py

Nhóm PCNV đã sử dụng một chương trình chấm giải đơn giản khác để đánh giá các bài này. Chương trình này chỉ đơn giản là tạo một ma trận MxN phần tử và yêu cầu các bài tham gia tính giá trị của các ô ngẫu nhiên tại thế một thế hệ trong tương lai.

Ở vòng đầu tiên, ma trận 1x1 được sử dụng.

G:\vithon\life>judge.py -c 1 -r 1 -n 10000 bilife.Board life.MainBoard treeoflife.Board cuocthidoi.Board
Generating random test case
Width = 1
Height = 1

0

Executing bilife.Board
Executing life.MainBoard
Executing treeoflife.Board
Executing cuocthidoi.Board

Checking for cell (0, 0)
Traceback (most recent call last):
  File "G:\vithon\life\judge.py", line 120, in <module>
    main()
  File "G:\vithon\life\judge.py", line 96, in main
    if results[module_name]['object'].get_cell(row, col):
  File "G:\vithon\life\treeoflife.py", line 160, in get_cell
    raise ValueError()
ValueError

Vì sinh ra lỗi nên mô-đun treeoflife đã bị loại.

Ở vòng hai, ma trận 2x2 được sử dụng và chỉ tính một thế hệ tương lai.

G:\vithon\life>judge.py -c 2 -r 2 -n 1 bilife.Board life.MainBoard cuocthidoi.Board
Generating random test case
Width = 2
Height = 2

1 1
0 1

Executing bilife.Board
Executing life.MainBoard
Executing cuocthidoi.Board

Checking for cell (0, 1)
*** alive count = 2, dead_count = 1
bilife is eliminated

Checking for cell (1, 0)
*** alive count = 3, dead_count = 0

Checking for cell (0, 0)
*** alive count = 2, dead_count = 1
bilife is eliminated

Checking for cell (1, 1)
*** alive count = 2, dead_count = 1
bilife is eliminated

RESULT:
[+] cuocthidoi : 0.000000 seconds
[+] life : 0.000000 seconds
[-] bilife : 0.000000 seconds

Với lần chạy này, chỉ có mô-đun bilife đưa ra kết quả sai cho trường hợp ô (0, 1). Chương trình chấm so sánh kết quả của mô-đun với kết quả của số đông. Trong trường hợp này, số đông đã đúng.

Sau hai lần chạy, chỉ còn lại hai mô-đun lifecuocthidoi.

Lần chạy thứ ba sử dụng ma trận 2x2 với một thế hệ.

G:\vithon\life>judge.py -c 2 -r 2 -n 1 life.MainBoard cuocthidoi.Board
Generating random test case
Width = 2
Height = 2

1 0
0 0

Executing life.MainBoard
Executing cuocthidoi.Board

Checking for cell (0, 0)
*** alive count = 1, dead_count = 1
life is eliminated

Checking for cell (1, 1)
*** alive count = 0, dead_count = 2

Checking for cell (1, 0)
*** alive count = 0, dead_count = 2

Checking for cell (1, 0)
*** alive count = 0, dead_count = 2

RESULT:
[-] life : 0.000000 seconds
[+] cuocthidoi : 0.000000 seconds

Với lần chạy này, life đã bị loại, và chỉ còn cuocthidoi.

Tóm lại, sau ba vòng chạy thì chỉ có mô-đun cuocthidoi đưa ra đáp án đúng. Tuy nhiên, giải này không có người chiến thắng vì mục tiêu của giải là thi về tốc độ thực thi. Khi chỉ có một đối thủ trong cuộc thi thì giải trở nên vô nghĩa. Hơn nữa, bài tham dự cuocthidoi.py đã không thực hiện đúng quy chế thứ 3 trong thể lệ tham gia nên cũng bị loại. Mặc dù không có người chiến thắng nhưng nhóm PCNV xin chúc mừng tác giả Vũ Khuê đã vượt qua các đối thủ khác trong cuộc thi.

Nói tóm lại, giải đã không đạt được mục tiêu đề ra ban đầu. Xin hẹn gặp các bạn ở các giải sau!