thảo luận Python đá Java ra chuồng gà !

  • Người tạo chủ đề Người tạo chủ đề Angelino
  • Ngày bắt đầu Ngày bắt đầu

Bạn thích Python hay Java ?

  • Python

  • Java


Chỉ xem được kết quả sau khi bình chọn.
Nhưng nó vẫn có những sự khác biệt, về bản chất thằng nào cũng phải dịch sang bytecode để chạy, Java sẽ compile cả project sang bytecode và đưa vào JVM để interpreter và chạy. Trong khi đó thằng Python nó sẽ vừa dịch từng dòng vừa chạy luôn nên nó sẽ lâu hơn.
zFNuZTA.png
Bác biết file .pyc sinh ra để làm gì không :whistle:
 
Nhưng nó vẫn có những sự khác biệt, về bản chất thằng nào cũng phải dịch sang bytecode để chạy, Java sẽ compile cả project sang bytecode và đưa vào JVM để interpreter và chạy. Trong khi đó thằng Python nó sẽ vừa dịch từng dòng vừa chạy luôn nên nó sẽ lâu hơn.
zFNuZTA.png

Ko có vừa dịch từng dòng vừa chạy nhé. Nó dịch 1 lần ra byte code là file .pyc rồi mổi lần chạy sẽ check timestamp của 2 file .py và .pyc nếu file .pyc là latest thì nó gửi cho Python Virtual Machine (PVM) để chạy luôn. Nếu ko phải latest thì nó dịch toàn bộ lệnh ra file .pyc trước rồi mới chạy.

Chỉ có trường hợp chạy từng lệnh line by line là ở Interative windows như trên console thôi.

1606448831578.png
 
Ko có vừa dịch từng dòng vừa chạy nhé. Nó dịch 1 lần ra byte code là file .pyc rồi mổi lần chạy sẽ check timestamp của 2 file .py và .pyc nếu file .pyc là latest thì nó gửi cho Python Virtual Machine (PVM) để chạy luôn. Nếu ko phải latest thì nó dịch toàn bộ lệnh ra file .pyc trước rồi mới chạy.

Chỉ có trường hợp chạy từng lệnh line by line là ở Interative windows như trên console thôi.

Xem tệp đính kèm 305046
Nếu như nó cũng complie ra Byte code thì tại sao nó lại châm hơn những thằng khác ? Cái tôi thắc mắc là vậy
Screenshot_20201127-125544_Chrome.jpg
 

Tệp đính kèm

  • Screenshot_20201127-130120_Chrome.jpg
    Screenshot_20201127-130120_Chrome.jpg
    440,8 KB · Lượt xem: 140
Byte code nó khác mã máy. Mã máy là CPU đọc và chạy thẳng được. Python nó chậm hơn C cũng y như Java, C# chậm hơn C là do chạy thông qua máy ảo JVM, CLR.

202044872042-cbc8-4694-8d2e-93740a694eb7.png


via theNEXTvoz for iPhone


Trên lý thuyết có thể làm ra CPU chạy trực tiếp bytecode luôn mà không cần biên dịch/thông dịch lại. Google thì cũng ra nhiều vd có sẵn luôn
https://en.wikipedia.org/wiki/PicoJava
http://www.rawbw.com/~davidm/jstamp/what_is_jstamp.html
 
file pyc này nó cũng là bytecode thôi bạn, phía trong nó vẫn chạy từng dòng bytecode, Nhưng cái này cũng k ảnh hưởng lắm, vấn đề nhất là các ngôn ngữ compile thì lookup một method, or attribute của object qua vtable, còn đối với python thì nó phải lookup qua dictionary, đó là 1 trong những nguyên nhân gây chậm ở python.

Ngoài ra thì python k có xài dc multithread nếu là tác vụ CPU bound cũng là 1 nguyên nhân, Lý do ở phía sau là cơ chế GC của python rất đơn giản, count ref đến một cái biến, nếu số ref = 0 thì sẽ xóa khỏi bộ nhớ, vấn đề là nếu nhiều thread cùng access đến một biến thì cái count này k đúng nữa, vì vậy nên tác giả thiết kế trong cùng 1 thời gian chỉ có 1 thread được chạy trên máy ảo Cpython

Nếu đang nói execute thì cái nào chả chạy từng dòng. Khi chưa compile ra Machine Code thì ngay cả assembly cũng chạy từng dòng thôi. Byte code là code để chạy máy ảo như JVM, CLR bên Java, C#.

Cái tôi phản bác vụ chạy từng dòng trên kia là vụ thông dịch và chạy từng dòng python code. Nó khác với scripting language như Javascript.
 
Trên lý thuyết có thể làm ra CPU chạy trực tiếp bytecode luôn mà không cần biên dịch/thông dịch lại. Google thì cũng ra nhiều vd có sẵn luôn
https://en.wikipedia.org/wiki/PicoJava
http://www.rawbw.com/~davidm/jstamp/what_is_jstamp.html

Lạc đề rồi, thiết kế phần cứng riêng thì chạy cái quái gì mà chả được. Còn hiện tại kiến trúc máy tính vẫn đang là tập lệnh x86, x64, ARM là phổ biến nhất.
 
Xếp hạng nghe ảo ảo, làm gì có cái db nào bao nhiêu ông code java, bao nhiêu ông python. Còn cái lấy xếp hạng tìm kiếm thì cũng ko thấy chính xác mấy. Dựa trên tuyển dụng của cty có khi còn hay hơn, kiểu 1 năm bao nhiêu job cho python, java...
Thống kê số repo vs topic trên githud
 
Các bác hay nhầm lẫn chổ ngôn ngữ "interpreted" hay "compiled", nếu nói đúng là "a specific implementation". Ngôn ngữ chỉ là plain text, còn thằng này ("a specific implementation") đóng vai trò quan trọng, chuyển từ ngôn ngữ sang mã để máy tính hiểu được. Hơn thua ở thằng này chứ k phải ở ngôn ngữ (tất nhiên static type và dynamic type cũng ảnh hưởng đến hiệu năng). Các công ty lớn như Java, Microsoft có đội ngũ kĩ sư chuyên tối ưu hóa compiler để đạt hiệu suất tốt nhất,..
Mỗi ngôn ngữ có thế mạnh riêng, nếu mang Python và Java ra so sánh thì cần chỉ rõ một lĩnh vực cụ thể nào. Nếu nói Python chậm, hoặc Java nhanh thì cũng k đúng, nhanh và chậm ở đây là đối với cái gì? Và mục tiêu của Python không phải để chạy nhanh nhất :D
Một vài ngu kiến của mình :)
 
Bác biết file .pyc sinh ra để làm gì không :whistle:
Thực ra ý này đúng 100% nhé "Trong khi đó thằng Python nó sẽ vừa dịch từng dòng vừa chạy luôn"

Mình biết một chút về python, xin giải thích vài ý các bạn ở đây hiểu sai về interpreter language (python, Javascript) và Virtual Machine.

1/ Để viết code Python chúng ta cần gì?

Python Virtual Machine (PVM) + file text python (thường là file.py)

2/ Python chạy như thế nào?

Khi viết code Python sẽ có 2 cases:
Trường hợp một là file code chỉ chứa code thông thường, không có import module.
VD: file code.py chứa 1 dòng print("hello world")
Khi đó thì python mỗi lần chạy sẽ phải biên dịch dòng print("hello world") ra byte code (một ngôn ngữ trung gian mức thấp để interpreter đọc).
Vậy việc biên dịch code python này diễn ra như thế nào và có phải do interpreter đảm nhiệm như chúng ta hay nhầm tưởng không? Câu trả lời là không, vì interpreter dịch là là trình thông dịch, đúng với cái tên thì nó không thể đảm nhiệm việc biên dịch code python được, nhiệm vụ của nó là đọc mã byte code để thông dịch qua mã máy để thực thi. Python Virtual Machine gồm có 2 thành phần chính là compiler và interpreter. Compiler thì thường sẽ viết bằng C/C++ còn interpreter có thể viết bằng C (Cpython), Python (PyPy), Java (JPython) đây là cái chúng ta hay nhầm với python compiler. Vì thế việc biên dịch code python ra byte code là do một python compiler (py_compile) đảm nhiệm. Sau đó interpreter mới bắt đầu đọc byte code đã được compiled này để in ra dòng "hello world".

Trường hợp thứ 2 là file python ngoài chứa code thông thường còn có import thêm các module bên ngoài vào.
VD: ta có file code.py và một file module khác là printapi.py cần được import vào trong file code.py. File code.py có nội dung như sau:

import printapi
printapi.PrintHelloWorld()

Khi đó PVM khi gặp dòng import printapi việc đầu tiên sẽ kiểm tra xem file printapi.py có tồn tại trong PATH của python không, nếu có thì nó vào trong folder pycache để tìm file printapi.pyc nếu file tồn tại thì nó sẽ kiểm tra xem cache byte code trong file printapi.pyc và mã code trong file printapi.py có khớp không. Nếu khớp thì PVM sẽ load data cache từ printapi.pyc vào trong file code.py. Nếu như cache byte code trong file printapi.pyc và mã code trong file printapi.py không khớp hoặc trong trường hợp không tìm thấy folder pycache, PVM sẽ tạo ra folder tại đường dẫn chứa file code.py sau đó dùng compiler để biên dịch file printapi.py đồng thời tạo ra file printapi.pyc để chứa pycache byte code. Cuối cùng nó sẽ load pycache của module printapi vào file code.py. Thế trong trường hợp nếu PVM không tìm thấy file printapi.py thì sao? Không sao cả, vì quá trình import module chỉ cần file .pyc là đủ. Nếu không tìm thấy cả file printapi.pyc lẫn file printapi.py thì PVM sẽ báo lỗi "importError".

Việc sinh ra file pycache byte code .pyc này là một optimize trick để khi chạy lại lần sau nếu file module python cần import không thay đổi gì thì PVM sẽ bỏ qua bước biên dịch ra byte code mà sẽ dùng thằng interpreter để đọc mã byte code từ file .pyc để chuyển sang machine code luôn.

3/ Tại sao python hay những ngôn ngữ thuộc loại interpreter lại chậm hơn?

Nếu ta dịch nghĩa 2 từ interpreter và compiler ra sẽ là thông dịch và biên dịch.
Lấy một VD thế này, bạn interpreter với một người nước ngoài thì nếu bạn giao tiếp qua một thông dịch viên từng câu chắc chắn sẽ chậm hơn việc bạn đọc bản dịch toàn bộ những gì họ nói. Vì quá trình thông dịch (interpreter) sẽ cần phải xử lý linh động ngay tại chỗ (run time-dynamic). Cũng giống như python (javascript) khi chạy code thì phải dịch từng dòng code sang mã máy (quá trình thông dịch này bao gồm rất nhiều bước parser, dynamic type check,...) nên sẽ làm giảm tốc độc thực thi rất nhiều so với việc chạy trực tiếp từ mã máy các ngôn ngữ thuần biên dịch như C/C++/Fortran. Nhưng chính vì lý do này mà đổi lại python rất linh động, và dễ chỉnh sửa code nhanh. Chưa kể do việc thực thi thông qua PVM nên python sẽ không bị phụ thuộc vào kiến trúc hardware , dễ port qua lại giữa các nền tảng vì nếu PVM được viết đa nền tảng thì chắc chắn python cũng sẽ thừa hưởng đa nền tảng.

Nên để trả lời cho câu "file .pyc sinh ra để làm gì?" thì file .pyc chỉ là file cache chưa byte code để optimize tốc độ thực thi (bỏ qua được bước compiling). Và đặc biệt chỉ có ích cho trường hợp import module. :D
 
Sửa lần cuối:
https://pg.ucsd.edu/cpython-internals.htm

Theo mình hiểu ở link này, CPython dịch tất cả sang bytecode rồi sau đó mới thực thi từng dòng :)
Nếu thực sự nó vừa dịch vừa chạy thì mình đã hiểu sai :oh:
Nếu dùng từ dịch rất dễ hiểu lầm vì thông dịch với biên dịch là 2 khái niệm hoàn toàn khác nhau. Python là thông dịch từng dòng và cả biên dịch, thông dịch khi file code chỉ chứa code python thuần, ko có import module. :D
 
Dân chơi AI, ML, DL các kiểu nên chọn python
Java thì cho thợ code web, code ứng dụng làng nhàng các kiểu:shame:
 
Nếu dùng từ dịch rất dễ hiểu lầm vì thông dịch với biên dịch là 2 khái niệm hoàn toàn khác nhau. Python là thông dịch từng dòng. :D

Cái thông dịch này là thông dịch từ byte code ra mã máy chứ ko phải python code. Còn từ python code ra byte code là compile.

Thông dịch từng dòng cho byte code thôi. Còn python code phải được compile ra byte code trước chứ sao mà thông dịch rồi chạy đươc.

Chỉ trường hợp run trong Interative console mới run thẳng thôi. Còn chuyện chạy không generate ra file byte code thì cũng có paramter để config cho PVM nhưng bên trong vẫn là compile ra byte code hết rồi mới chạy vì PVM chỉ hiểu byte code.
 
Sửa lần cuối:

Thống kê chủ đề

Ngày tạo
Angelino,
Người trả lời cuối
Khang.Hy.Gia.222,
Trả lời
121
Lượt xem
24.895
Quay lại
Lên đầu trang