[ Python và ứng dụng ] Lập trình thư viện cho VBA bằng Python (1 người xem)

  • Thread starter Thread starter befaint
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
14,587
Được thích
19,796
Mình đọc tiêu đề là đã thấy hấp dẫn rồi á. :)

Mình có tìm hiểu qua vụ này thì thấy có vẻ rất ít thông tin, có thể Python vốn là mã nguồn mở, hoặc có thể đã dùng Python rồi thì không mấy ai để ý tới VBA nữa.
Đã có một số chương trình tích hợp Python với Excel, VBA nhưng đều cần cài đặt Python mới chạy được.

Mình vọc một hồi (hồi khá lâu...) ra cách tạo thư viện cho VBA bằng Python mà không khi phân phối không cần cài đặt Python trên máy tính sử dụng thư viện.
Đại khái một số thông tin như thế này:
* Đầu tiên, được gọi là "thư viện" vì không cần cài đặt Python trên máy tính sử dụng chúng.
* Bảo mật: tương đương Windows DLL.
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
* Tốc độ: tùy vào khả năng viết code. Về cơ bản nó là Python mà.

Mình vọc hồi khá lâu vì vụ bảo mật kia. Hình như chưa có ai làm, hoặc không có gì đáng quan tâm, hoặc ai đó làm rồi mà họ không đăng lên internet nên mình chưa tìm thấy.

Mình làm một ví dụ, coi như động lực để bạn nào có hứng thú thì tự tìm hiểu nha. Tự khám phá ra mới hay mà.

Bài ví dụ: Lấy dữ liệu tỷ giá ngoại tệ từ trang web Vietcombank theo khoảng thời gian.
(Tiếp ví dụ ở bài https://www.giaiphapexcel.com/diendan/threads/lập-trình-trong-power-query-và-các-ví-dụ.157214/)

Chạy thử lấy dữ liệu 01 tháng trên máy tính của mình hết cỡ 1.8 giây.
Ai biết code Delphi thử làm bài ví dụ này xem ra sao nhỉ.

Các bạn tải file về nhớ đọc và làm theo hướng dẫn nhé. >> Tải File.

1633165995368.png
 
Lần chỉnh sửa cuối:
Nghe rất hấp dẫn anh. Mà chưa biết bắt đầu Python từ đâu anh ạ.
 
Upvote 0
Upvote 0
Mình đọc tiêu đề là đã thấy hấp dẫn rồi á. :)

Mình có tìm hiểu qua vụ này thì thấy có vẻ rất ít thông tin, có thể Python vốn là mã nguồn mở, hoặc có thể đã dùng Python rồi thì không mấy ai để ý tới VBA nữa.
Đã có một số chương trình tích hợp Python với Excel, VBA nhưng đều cần cài đặt Python mới chạy được.

Mình vọc một hồi (hồi khá lâu...) ra cách tạo thư viện cho VBA bằng Python mà không khi phân phối không cần cài đặt Python trên máy tính sử dụng thư viện.
Đại khái một số thông tin như thế này:
* Đầu tiên, được gọi là "thư viện" vì không cần cài đặt Python trên máy tính sử dụng chúng.
* Bảo mật: tương đương Windows DLL.
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
* Tốc độ: tùy vào khả năng viết code. Về cơ bản nó là Python mà.

Mình vọc hồi khá lâu vì vụ bảo mật kia. Hình như chưa có ai làm, hoặc không có gì đáng quan tâm, hoặc ai đó làm rồi mà họ không đăng lên internet nên mình chưa tìm thấy.

Mình làm một ví dụ, coi như động lực để bạn nào có hứng thú thì tự tìm hiểu nha. Tự khám phá ra mới hay mà.

Bài ví dụ: Lấy dữ liệu tỷ giá ngoại tệ từ trang web Vietcombank theo khoảng thời gian.
(Tiếp ví dụ ở bài https://www.giaiphapexcel.com/diendan/threads/lập-trình-trong-power-query-và-các-ví-dụ.157214/)

Chạy thử lấy dữ liệu 01 tháng trên máy tính của mình hết cỡ 1.8 giây.
Ai biết code Delphi thử làm bài ví dụ này xem ra sao nhỉ.

Các bạn tải file về nhớ đọc và làm theo hướng dẫn nhé. >> Tải File.

View attachment 267108
hay đó lách nó qua EXE mà lỗi trên Office 365 x64
 
Upvote 0
Mình là gà về Python, nhưng mình xem sơ qua nội dung bên trong file thì nó vẫn chạy thư viện của "python37.dll" cái này mở trình quản lý process sẽ thấy, và cái này chắc chắn là ko phải mã máy nhe bạn ( vì vẫn có thể dịch thành code python)
Bài đã được tự động gộp:

lỗi này chắc bạn chưa chạy file đăng kí, hoặc UAC máy đang cao.
 
Upvote 0
Mình là gà về Python, nhưng mình xem sơ qua nội dung bên trong file thì nó vẫn chạy thư viện của "python37.dll" cái này mở trình quản lý process sẽ thấy, và cái này chắc chắn là ko phải mã máy nhe bạn ( vì vẫn có thể dịch thành code python)
Bạn tìm hiểu kỹ, tìm hiểu thật đi. Hiện giờ còn chưa biết code của mình ở chỗ nào ấy. :)
Mà chắc chưa đọc kỹ bài #1 rồi.
 
Upvote 0
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
mình chỉ chú ý đoạn này thôi, mà giải nén cái exe của bạn nó ra 1 nùi file, người dùng ko cài python nhưng nó đã nén tất cả thư viện để chạy python vô đó.
1633229189412.png
 
Upvote 0
mình chỉ chú ý đoạn này thôi, mà giải nén cái exe của bạn nó ra 1 nùi file, người dùng ko cài python nhưng nó đã nén tất cả thư viện để chạy python vô đó.
Nùi hay cả núi phai cũng không làm sao cả.
Không phải mình vì muốn giấu code mà phải cài Delphi tốn gần chục GB dung lượng ổ đĩa, rồi lọ mọ cốt các kiểu mà vẫn lỗi tùm lum ấy.
Một hay nhiều phai không quan trọng, quan trọng là kỹ thuật và thực chiến ra sao.
Mình cứ thong thả tìm hiểu.
Từ từ rồi mình sẽ nêu kỹ thuật ở bài #1 sao nó lại có tốc độ kinh hoàng thế.
 
Upvote 0
Công bằng mà nói Thì Mạnh nói như sau

1/ Nhanh hay chậm do chính chúng ta code ... thuật toán code + cách xử lý nó

2/ cùng 1 vấn đề và thuật toán + cách xử lý như nhau thì C++ Or Delphi là nhanh nhất
chưa ai nói Python nhanh hơn c++ Or Delphi .. cả

3/ Ngay code trên Delphi nhiều người viết còn chạy chậm hơn cả VBA đấy ==> vấn đề đó tại sao = tại trình của mình chưa đạt nên viết trên Delphi mà chạy còn thua cả VBA đấy ( chính Mạnh đã từng bị thế ... sau này code khá hơn chút mới nhìn ra cái đó )

chúc mọi người bàn tán vui vẻ
 
Upvote 0
file bài số 1 code + cách xử lý hay đó ... nghiên cứu thêm chút cho office x64 là viết Public ok rồi
tốc độ rất nhanh là do chính ta code
 
Upvote 0
Hôm nay mình sẽ nêu kỹ thuật ở bài #1 nhé.

Đó là kỹ thuật tạo và đăng ký một COM Server của Python.
Trong VBA (hay ứng dụng khác đều gọi được) gọi COM Server kia lên, cần dùng chức năng gì của COM Server đó thì cứ truyền tham số (nếu có) và gọi lên thôi.
Và kết quả là ta có một ứng dụng Python chạy độc lập và trả về kết quả mong muốn, vì vậy không hề ngạc nhiên về tốc độ xử lý của nó.

Cách này có ưu điểm vượt trội:

- Toàn bộ xử lý của phần "thư viện" là Python làm việc. Trong VBA (hay ở ứng dụng nào đó) chỉ đơn giản là gửi lệnh đi và nhận kết quả mà thôi.
Nó không hề phải chịu cảnh 'dưới trướng' như cách gọi từ *.dll.

- Không liên quan, không phụ thuộc gì vào ứng dụng sử dụng thư viện là 32-64bit gì cả. Bản thân tập lệnh Python được xuất ra *.exe là chạy hoàn toàn độc lập. Kỹ thuật này chỉ đơn giản là tạo ra một cây cầu mà thôi.

Mình làm một ví dụ minh họa cho dễ hiểu. Khi gọi lệnh thì msgbox là của Python, và bên VBA vẫn lấy được kết quả.

>> Tải file ví dụ
 
Upvote 0
Hôm nay mình sẽ nêu kỹ thuật ở bài #1 nhé.

Đó là kỹ thuật tạo và đăng ký một COM Server của Python.
Trong VBA (hay ứng dụng khác đều gọi được) gọi COM Server kia lên, cần dùng chức năng gì của COM Server đó thì cứ truyền tham số (nếu có) và gọi lên thôi.
Và kết quả là ta có một ứng dụng Python chạy độc lập và trả về kết quả mong muốn, vì vậy không hề ngạc nhiên về tốc độ xử lý của nó.

Cách này có ưu điểm vượt trội:

- Toàn bộ xử lý của phần "thư viện" là Python làm việc. Trong VBA (hay ở ứng dụng nào đó) chỉ đơn giản là gửi lệnh đi và nhận kết quả mà thôi.
Nó không hề phải chịu cảnh 'dưới trướng' như cách gọi từ *.dll.

- Không liên quan, không phụ thuộc gì vào ứng dụng sử dụng thư viện là 32-64bit gì cả. Bản thân tập lệnh Python được xuất ra *.exe là chạy hoàn toàn độc lập. Kỹ thuật này chỉ đơn giản là tạo ra một cây cầu mà thôi.

Mình làm một ví dụ minh họa cho dễ hiểu. Khi gọi lệnh thì msgbox là của Python, và bên VBA vẫn lấy được kết quả.

>> Tải file ví dụ
Vẫn lỗi như cũ trên Office 365 x64

trên VB6 ActiveX EXE cũng đăng ký COM Server y trang thế

1633340923168.png
 
Upvote 0
Upvote 0
Upvote 0
Tôi đang chạy Windows 64 + Office 2016 64 bình thường. Khoái cái món này đây.
 
Upvote 0
Upvote 0
* Bảo mật: tương đương Windows DLL.
Tìm hiểu qua thông tin thấy nó cũng là mã máy gì gì đó.
Mình thì không biết gì về py nhưng dạo 1 dòng thấy người ta ghi như vậy không biết phải không @befaint
"
Biến code Python thành file exe: Đây là cách rất hữu hiệu nếu bạn muốn chạy chương trình của bạn ở khắp các máy tính mà không cần phải cài Python vào máy rồi thông dịch (biên dịch thành bytecode) nó, chỉ cần chạy cái file exe là xong, chẳng cần cái gì. Ngoài ra, đây cũng là cách để chống dịch ngược code Python......
Cho dù dùng cách gì đi chăng nữa thì Python vẫn là một ngôn ngữ dễ bị dịch ngược hơn C, C++ (Bản thân Python được xây dựng dựa trên C, C++). Những cách trên cũng chỉ có hiệu quả với mấy gã tay mơ thôi, ........
"
Code msgbox của bạn chạy bình thường trên máy mình
 
Upvote 0
Tóm lại diễn đàn mình vẫn hiểu khái niệm bảo mật đơn giản, không đúng nghĩa bảo mật

bảo mật đâu phải bảo vệ mấy cái code ta viết ra? đó là che giấu code mà thôi.
Còn đúng nghĩa bảo mật là khác, giờ người ta còn opensource luôn - mà đọc được code hết và làm sai copyright (bản quyền) thì thiếu gì cách đâu phải xem code.
 
Upvote 0
Mình thì không biết gì về py nhưng dạo 1 dòng thấy người ta ghi như vậy không biết phải không @befaint
"
Biến code Python thành file exe: Đây là cách rất hữu hiệu nếu bạn muốn chạy chương trình của bạn ở khắp các máy tính mà không cần phải cài Python vào máy rồi thông dịch (biên dịch thành bytecode) nó, chỉ cần chạy cái file exe là xong, chẳng cần cái gì. Ngoài ra, đây cũng là cách để chống dịch ngược code Python......
Cho dù dùng cách gì đi chăng nữa thì Python vẫn là một ngôn ngữ dễ bị dịch ngược hơn C, C++ (Bản thân Python được xây dựng dựa trên C, C++). Những cách trên cũng chỉ có hiệu quả với mấy gã tay mơ thôi, ........
"
Code msgbox của bạn chạy bình thường trên máy mình
Cái *.exe thông thường thì đúng là vậy. Nhưng *.pyd lại khác hoàn toàn. Không dịch ngược lại thành Python code được, chỉ có thể dùng RE mà thôi.
Bài #1 khúc bảo mật mình có để link rồi đó, hoặc có thể tìm thêm thông tin trên stackoverflow... cũng có nói nhiều về cái này. Nó cũng như dll dịch ra mã máy, có thể có khả năng RE được nhưng chi phí, và thời gian thường là quá lớn so với tự viết code từ đầu; và những người có khả năng RE được thì họ sẽ viết mới luôn.
 
Upvote 0
Tóm lại diễn đàn mình vẫn hiểu khái niệm bảo mật đơn giản, không đúng nghĩa bảo mật

bảo mật đâu phải bảo vệ mấy cái code ta viết ra? đó là che giấu code mà thôi.
Còn đúng nghĩa bảo mật là khác, giờ người ta còn opensource luôn - mà đọc được code hết và làm sai copyright (bản quyền) thì thiếu gì cách đâu phải xem code.
.
Ở bài #1, em nêu về bảo mật cũng chỉ là phần nhỏ thôi. Chắc mọi người quan tâm quá nội dung đó nên cảm giác đó là ý chính. :)
Còn em thì tập trung vào những ưu điểm đã nêu ở bài #13.
.
Nếu nói thêm về phần bảo mật thì em thấy đó (những quan tâm ở diễn đàn về che giấu code) là hoàn toàn hợp lý (cả về thực trạng, và mục đích).
Bảo mật có thể hiểu rất đơn giản và cơ bản là bảo vệ, làm bí mật đi, che giấu cái gì đó.
Mất gà rồi mới lo làm chuồng thì không kịp nữa rồi. Ở môi trường mà việc thực hiện pháp luật chưa nghiêm, hiểu biết pháp luật chưa đầy đủ, và/ hoặc có thể mức độ răn đe của luật chưa cao thì tự bản thân cần có, cần trang bị những biện pháp tự bảo vệ lấy sản phẩm của mình.

Em ví dụ mới đây, ở chủ đề về việc in ấn, có nảy sinh vấn đề loại bỏ thông tin được tác giả chèn ở đầu/ cuối mỗi trang của tập tin PDF, đó là việc vi phạm bản quyền...
Rồi có việc khác là thành viên phát hiện việc vi phạm bản quyền (tự ý chèn link quảng cáo vào tập tin PDF của người khác), em kêu tố giác tội phạm mà họ còn không hiểu thế nào là tố giác tội phạm (Thời điểm hiện tại, Nhà nước ta đã tiếp nhận những thông tin tố giác, thông tin phản ánh trên nền tảng mạng xã hội làm căn cứ điều tra, xử lý tội phạm rồi, chưa cần đến mức phải viết đơn tố giác + kèm bằng chứng đâu).

Việc mọi người tìm cách che giấu code cũng như mỗi nhà làm khóa cổng, khóa cửa đó anh. Tự bảo vệ trước khi cần tới pháp luật (bản quyền), tự tạo ra rào chắn ngăn cản xâm phạm trái phép.
 
Upvote 0
Thông dịch mà đâu phải mã máy
.
Không phải vậy anh.
Python là ngôn ngữ lập trình, như anh viết Pascal trên Delphi đó.
Anh viết xong chương trình trên Delphi rồi mới biên dịch thành phần mềm, thành tập tin *.dll thì mới có đoạn gọi là mã máy gì hay không, còn trước khúc biên dịch thì nó là một ngôn ngữ lập trình thôi.
Cái *.pyd cũng như vậy.
Ban đầu nó là Python code, kế đó được chuyển (convert) thành C code, tiếp đó được biên dịch thành 'Dynamic link librarie' ở dạng *.pyd, vì vậy nó mới tương đương cái *.dll của anh. Chứ không phải Python code bình thường đâu.
 
Upvote 0
chạy đó ... kéo UAC xuống mới Ok ... còn tại sao thì ko biết

1633402620090.png
 
Upvote 0
.
Không phải vậy anh.
Python là ngôn ngữ lập trình, như anh viết Pascal trên Delphi đó.
Anh viết xong chương trình trên Delphi rồi mới biên dịch thành phần mềm, thành tập tin *.dll thì mới có đoạn gọi là mã máy gì hay không, còn trước khúc biên dịch thì nó là một ngôn ngữ lập trình thôi.
Cái *.pyd cũng như vậy.
Ban đầu nó là Python code, kế đó được chuyển (convert) thành C code, tiếp đó được biên dịch thành 'Dynamic link librarie' ở dạng *.pyd, vì vậy nó mới tương đương cái *.dll của anh. Chứ không phải Python code bình thường đâu.
thấy vậy nè còn sao thì ko có biết
1/ Khi Python Build EXE thì nó gom hết tất cả các File vào trong đó ... đoán thôi khi chạy nó giải nén ra đâu đó hay chạy ảo hóa gì đó

2/ Thực tế là họ giải nén ( Unpack ) nó ra rất nhiều file trong EXE do python viết

3/ còn sao thì chịu ... nhưng thế giới họ keo đó là Python thông dịch chứ ko phải biên dịch như wiki có mô ta chi tiết úp bài trước
 
Upvote 0
thấy vậy nè còn sao thì ko có biết
1/ Khi Python Build EXE thì nó gom hết tất cả các File vào trong đó ... đoán thôi khi chạy nó giải nén ra đâu đó hay chạy ảo hóa gì đó

2/ Thực tế là họ giải nén ( Unpack ) nó ra rất nhiều file trong EXE do python viết
Khi đóng gói *.py thành *.exe thì sẽ đóng gói toàn bộ thư viện cần thiết và kèm theo Bootloader để khởi chạy Python như khi cài Python hoàn chỉnh.
Như em nói ở bài #13 đó, thư viện nhưng nó lại là Python chạy độc lập, vì vậy nó rất là hay luôn.

3/ còn sao thì chịu ... nhưng thế giới họ keo đó là Python thông dịch chứ ko phải biên dịch như wiki có mô ta chi tiết úp bài trước
Với *.py thì chính là như vậy, nhưng *.pyd lại khác.
 
Upvote 0
Khi đóng gói *.py thành *.exe thì sẽ đóng gói toàn bộ thư viện cần thiết và kèm theo Bootloader để khởi chạy Python như khi cài Python hoàn chỉnh.
Như em nói ở bài #13 đó, thư viện nhưng nó lại là Python chạy độc lập, vì vậy nó rất là hay luôn.


Với *.py thì chính là như vậy, nhưng *.pyd lại khác.
chính xác là nó đấy kiểu như C# có một mớ File đi theo ... còn Python nó khôn hơn gom 1 mớ Files nén vào EXE ... mấy tay Unpack nó giải nén ra hết

tróng đó có 1 số file là mã nhị phân ko dịch được xong từ thư viện của nó laod cái đó

Minh họa hình sau có 1 File EXE Build = Python giải nén ( Tạm keo thế ) ra quá nhiều File = 42 file trong 1 file EXE đấy

1633403743397.png
 
Upvote 0
chính xác là nó đấy kiểu như C# có một mớ File đi theo ... còn Python nó khôn hơn gom 1 mớ Files nén vào EXE ... mấy tay Unpack nó giải nén ra hết

Ruột *.pyd là C code đấy anh.

1633403855489.png

Cái *.exe chỉ đó vai trò đóng gói và chạy ứng dụng thôi, giải nén ra bình thường mà anh, nhưng rồi chỉ ngắm thôi.
 
Upvote 0
Ruột *.pyd là C code đấy anh.

View attachment 267194

Cái *.exe chỉ đó vai trò đóng gói và chạy ứng dụng thôi, giải nén ra bình thường mà anh, nhưng rồi chỉ ngắm thôi.
biết mà nhưng nói gì thì nói nó là thông dịch tốc độ sẻ thua biên dịch cùng 1 vấn đề và thuật toán như nhau
Bài đã được tự động gộp:

tối qua đọc nguyên đêm Ptython rồi ... và kỷ nguyên 4.0 dân lập trình nên biết vài ngôn ngữ khác nhau
Cái nào tốt mặt nào thì sử dụng mặt đó ... còn dở thì né nó ra

Py hay là cộng đồng mở nhiều thư viện họ viết cho hết còn ta chỉ việc ... nên học nó nhanh là thế
 
Lần chỉnh sửa cuối:
Upvote 0
Mới thử lại file bài số 1 chạy tốt đấy ... cứ thế phát triển là ok

Nhưng UAC kéo xuống mới chạy ok ... còn tại sao thì chịu

1633405861996.png
 
Upvote 0
Ruột *.pyd là C code đấy anh.

View attachment 267194

Cái *.exe chỉ đó vai trò đóng gói và chạy ứng dụng thôi, giải nén ra bình thường mà anh, nhưng rồi chỉ ngắm thôi.
Cái này mình nghĩ là hên sui, nhưng mà vậy là cũng được rồi, nếu được thì bạn nên làm clip hướng dẫn để những người muốn tìm hiểu có được chúc thông tin để tìm hiểu
 
Upvote 0
Code két cái sự khởi đầu và khai phá viết ra nó rất vả vất .... Python kiểu này là hàng độc lần đầu xuất hiện tại GPE này đấy -0-0-0- ===\.

Cố giắng bảo mật tốt chút viết các Thư viện hàm mà sử dụng cho Excel và trưng bày sản phẩm là OK rồi

Xin chúc mừng hàng độc lần đầu ra công chúng ... GPE
 
Upvote 0
Code két cái sự khởi đầu và khai phá viết ra nó rất vả vất .... Python kiểu này là hàng độc lần đầu xuất hiện tại GPE này đấy -0-0-0- ===\.

Cố giắng bảo mật tốt chút viết các Thư viện hàm mà sử dụng cho Excel và trưng bày sản phẩm là OK rồi

Xin chúc mừng hàng độc lần đầu ra công chúng ... GPE
Em thấy anh @excel_lv1.5 có viết Python, 1 bài giống giống bài này, lấy dữ liệu cảng vụ hàng hải (bài #15)


Em có định làm bằng Power Query, nhưng không biết tham số ngày họ dấu ở đâu, nên chưa có giải pháp.
 
Upvote 0
.........................
 
Lần chỉnh sửa cuối:
Upvote 0
Em thấy anh @excel_lv1.5 có viết Python, 1 bài giống giống bài này, lấy dữ liệu cảng vụ hàng hải (bài #15)


Em có định làm bằng Power Query, nhưng không biết tham số ngày họ dấu ở đâu, nên chưa có giải pháp.
Python tôi xin chịu ... cũng hóng hớt chút thôi... qua đó hỏi họ xem sao hay thớt này hỏi @befaint xem tình hình sao
 
Upvote 0
Delphi có cái thư viện nào làm việc với Web, cào dữ liệu web không bạn?
Hình như có hết đấy ... cài Delphi đi mà xem code mẫu ngay chính trên máy đó
Xem hình sau nha ... học hết cái mớ đó là siêu đấy

2 năm trước tôi xem ko biết sử dụng luôn ... có cái mở lên cứ Build là lỗi sau này mới biết tại sao nó lỗi
Tìm nát google tải về đầy máy cuối cùng mới té ra trên máy mình đã có hết khi cài Delphi

1633439401649.png
 
Upvote 0
Mình ngồi nghiên cứu cả ngày mới in ra được chữ "hello world" ra màn hình cmd bằng python, thích thặc. Hi vọng học thêm 2 năm nữa sẽ viết được ứng dụng python như bài #1 của anh Befaint. :)
 
Upvote 0
Hihi để tối rảnh rỗi gà delphi code thử xem sao :p:p
 
Upvote 0
Mình ngồi nghiên cứu cả ngày mới in ra được chữ "hello world" ra màn hình cmd bằng python, thích thặc. Hi vọng học thêm 2 năm nữa sẽ viết được ứng dụng python như bài #1 của anh Befaint. :)
Tôi vọc được vài bữa thấy chậm tiến quá nên vứt luôn --=0
 
Upvote 0
Tôi vọc được vài bữa thấy chậm tiến quá nên vứt luôn --=0
Học Python đi sẻ rất nhanh đấy ... thư viện họ viết cho hết còn mình chỉ Việc .....xơi
quan trọng nhất là có biết ... hay ko thôi

File bài số 1 nén hết cả cái thư viện Python vào đó nên to quá ... đó là mới 1 code ...
nếu nhiều thì chưa biết sao vì mình ko sử dụng Py cho nên đoán bạy tí -0-0-0-
 
Upvote 0
Học Python đi sẻ rất nhanh đấy ... thư viện họ viết cho hết còn mình chỉ Việc .....xơi
quan trọng nhất là có biết ... hay ko thôi

File bài số 1 nó nén hết cả cái thư viện Python vào đó nên to quá ... đó là mới 1 code ...
nếu nhiều thì chưa biết sao vì mình ko sử dụng Py cho nên đoán bạy tí -0-0-0-
Với bạn thì có thể nhanh chứ với tôi thì không. Bởi chậm tiêu quá thôi trớt cho nhẹ đầu.
 
Upvote 0
Với bạn thì có thể nhanh chứ với tôi thì không. Bởi chậm tiêu quá thôi trớt cho nhẹ đầu.
Học cái gì cũng thế khó nhất là cái ngưỡng ban đầu nhập môn VD như khai báo và sử dụng vv...
qua cái cửa trên là từng bước viết tốt :D
 
Upvote 0
đã viết xong :clap: do mang mình yếu nên thới gian PY dao dộng từ 3-4 s
py.jpgDelphi.jpg
 
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Còn chuẩn hoá kết quả nữa chứ, như kia vẫn là string thôi à.
Nếu bỏ qua chuẩn hoá kết quả thì Python chạy chưa tới 1 giây á.
 
Upvote 0
Viết thẳng trên Python lấy 1 tháng máy tôi trung bình có 0.5s, lấy từ đâu năm tới giờ thì khoảng 3s, python nó lập trình đa luồng được, VBA hay delphi phải lập trình đa luồng mới so được với Python khi crawl data web, dùng VBA để gọi có thể chậm hơn tý1633535569737.png1633535558241.png
 
Upvote 0
Viết thẳng trên Python lấy 1 tháng máy tôi trung bình có 0.5s, lấy từ đâu năm tới giờ thì khoảng 3s, python nó lập trình đa luồng được, VBA hay delphi phải lập trình đa luồng mới so được với Python khi crawl data web, dùng VBA để gọi có thể chậm hơn týView attachment 267308View attachment 267307
Úp File cho mình thử chút xem có như bạn nói không 0.5s

Lưu ý máy mình ko cài Python
 
Upvote 0
Còn chuẩn hoá kết quả nữa chứ, như kia vẫn là string thôi à.
Nếu bỏ qua chuẩn hoá kết quả thì Python chạy chưa tới 1 giây á.
Cái này dễ mà, chẳng qua mới đầu mình không định up file để vậy cho dễ phân biệt
Viết thẳng trên Python lấy 1 tháng máy tôi trung bình có 0.5s, lấy từ đâu năm tới giờ thì khoảng 3s, python nó lập trình đa luồng được, VBA hay delphi phải lập trình đa luồng mới so được với Python khi crawl data web, dùng VBA để gọi có thể chậm hơn týView attachment 267308View attachment 267307
hihhi chạy multi thear thì cao cấp rồi anh nhưng mà để sync Display thì cũng mệt ah

ggg.jpg
 
Upvote 0
Cái này dễ mà, chẳng qua mới đầu mình không định up file để vậy cho dễ phân biệt

hihhi chạy multi thear thì cao cấp rồi anh nhưng mà để sync Display thì cũng mệt ah

View attachment 267323

Multi thread là chuyện quá bình thường thôi bạn, có gì mà cao cấp đâu. Tất cả mấy thứ đó đều là giải thuật, ứng dụng thành phần lập trình, những cái này thì ngôn ngữ lập trình nào cũng có cả (trừ code thuần VBA, nhưng làm DLL goi trong VBA vẫn multi thread được nhé). File của bạn còn chưa ứng dụng multi thread mà đã vậy, nếu ứng dụng nó thì sao nhỉ. Bạn xem tạm ví dụ đơn giản lập trình multi thread với Delphi để phát triển các ví dụ khác.
 
Upvote 0
Multi thread là chuyện quá bình thường thôi bạn, có gì mà cao cấp đâu. Tất cả mấy thứ đó đều là giải thuật, ứng dụng thành phần lập trình, những cái này thì ngôn ngữ lập trình nào cũng có cả (trừ code thuần VBA, nhưng làm DLL goi trong VBA vẫn multi thread được nhé). File của bạn còn chưa ứng dụng multi thread mà đã vậy, nếu ứng dụng nó thì sao nhỉ. Bạn xem tạm ví dụ đơn giản lập trình multi thread với Delphi để phát triển các ví dụ khác.
Vâng cái dll em post lên chưa viết multi thread. Cái multi thread là em mới viết trên Form à anh.
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Úp File cho mình thử chút xem có như bạn nói không 0.5s

Lưu ý máy mình ko cài Python
Tôi đã nói chạy thẳng trên Python, tức là dùng trình biên dịch của Python (đang dùng extension jupyter trong vs code) thì nó đạt tốc độ như vậy, bạn muốn kiểm tra thì cài Python mà thử chứ tôi chế làm gì, còn nén thành exe nó chạy chậm hơn cũng không chừng
Cái này dễ mà, chẳng qua mới đầu mình không định up file để vậy cho dễ phân biệt

hihhi chạy multi thear thì cao cấp rồi anh nhưng mà để sync Display thì cũng mệt ah

View attachment 267323
Bạn chạy thử dữ liệu 2 năm xem máy tôi mất khoảng 9s, chạy đơn luông mất 142s , multithread khi dùng để crawl lấy càng nhiều thì tốc độ nó mói rõ rệt so với chạy đơn luồng1633585215828.png1633584445826.png
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi đã nói chạy thẳng trên Python, tức là dùng trình biên dịch của Python (đang dùng extension jupyter trong vs code) thì nó đạt tốc độ như vậy, bạn muốn kiểm tra thì cài Python mà thử chứ tôi chế làm gì, còn nén thành exe nó chạy chậm hơn cũng không chừng

Bạn chạy thử dữ liệu 2 năm xem máy tôi mất khoảng 9s, chạy đơn luông mất 142s , multithread khi dùng để crawl lấy càng nhiều thì tốc độ nó mói rõ rệt so với chạy đơn luồngView attachment 267326View attachment 267325
Cả hai hãy thử lấy 10 năm xem sao là biết thôi ... vì viết trên môi trường nào cũng thế ... dữ liệu lớn mới có thể xem xét được ( phụ thuộc mạng thì xem xét ở góc độ khác )
 
Upvote 0
Mình lại tưởng chưa ứng dụng multi thread. Sao thời gian thực hiện lại là số 0 vậy? Em tăng số liệu 10 năm lên xem số nhảy là bao nhiêu? :D
Em xử lý add vào array trong luồng luôn anh, khi mà array có dữ liệu là nó display lên. Trong khi đó luồng nó vẫn tiếp tục xử lý, em đang đau đầu cái chỗ xử lý nối tiếp array
 
Upvote 0
Em xử lý add vào array trong luồng luôn anh, khi mà array có dữ liệu là nó display lên. Trong khi đó luồng nó vẫn tiếp tục xử lý, em đang đau đầu cái chỗ xử lý nối tiếp array

Muốn so sánh thì phải đưa về một kiểu mới nên so sánh. Ở các môi trường IDE, các nhà sản xuất họ lập trình dùng thủ thuật hoặc sử dụng controls đặc biệt để vẽ dữ liệu vào với tốc độ nhanh nên không phản ánh tốc độ sau biên dịch của sản phẩm lập trình sau khi build. Muốn so sánh hãy đẩy dữ liệu ra bảng tính Excel.

Vấn đề nạp danh sách trong quá trình chạy đa luồng - multi thread. Hãy nạp dữ liệu vào TThreadList. Cách dùng TThreadList tại đây.
Để chạy đa luồng, đợi cho tất cả các luồng kết thúc rồi điền dữ liệu từ TThreadList ra đâu đó thì dùng TTask. Cách làm trong Delphi như sau:
1. Thêm unit "Threading"
2. Sử dụng TTask.WaitForAll(array of ITask) để đợi cho tất cả các luồng hoàn thành, tức TThreadList đã nhận đủ dữ liệu.
3. Đẩy dữ liệu từ TThreadList ra Excel hay control nào đó.

Không biết bạn đang dùng component nào để download dữ liệu từ web, nếu trong luồng bạn chạy trang web mà gặp vấn đề thì dùng TidHTTP hoặc THTTPClient nó hỗ trợ tốt trong đa luồng.

Đó là kiến trúc lập trình còn cụ thể ở khúc nào bạn tìm kiếm là ra đầy link tham khảo.

Nếu đã lập trình được như mình chỉ thì chơi hẳn 10 năm hoặc hơn cho máu nhé. :D
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu làm như cách thông thường khi Thread kết thúc dữ liệu 1 năm, em code nó chạy khoản 75 s.
Hic sửa tới, sửa lui sai rồi. Hihi để tối rảnh em làm lại
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu làm như cách thông thường khi Thread kết thúc dữ liệu 1 năm, em code nó chạy khoản 75 s
multi thread dll :p

Thế là làm tận 11 năm thật luôn à? Vậy chính thức với 11 năm thì Delphi bạn làm chạy hết bao nhiêu giây? Tính cả thời gian điển ra Excel chứ?
 
Upvote 0
Máy tôi chạy thời gian như bạn 11 năm mất tầm 50s tính luôn xuất excel, khi crawl data web dùng multithread thì các khả năng sau có thể ảnh hưởng đến tốc độ: tốc độ mạng (thời gian gửi request, thời gian phản hồi của server), số lượng request cùng lúc quá nhiều có thể làm thời gian gửi và server phản hồi chậm hơn, sức mạnh của CPU (số lượng luồng tối đa mà con CPU có thể gửi cùng lúc, ví dụ con I3 có thể gửi 10 luồng cùng lúc, I7 có thể gửi 20 luồng cùng lúc như vậy I7 có thể nhanh hơn gấp đôi I3, mặc dù có thể set I3 gửi 20 luồng được nhưng chất lượng mỗi luồng sẽ giảm đi phân nữa do tài nguyên không đủ), tôi nghĩ khả năng là con CPU bạn yếu + code chưa tối ưu lấy 2 năm mất có 22s mà 11 năm mất 187s (tôi thường làm với multithread thấy khi lấy càng nhiều dữ liệu thì thời gian trung bình mỗi luồng sẽ giảm xuống), tôi nghĩ nếu viết chuẩn trên Delphi có thể nhanh hơn Python vì Python mặc định chỉ sử dụng có 1 nhân CPU thôi1633635480482.png
 
Upvote 0
Máy tôi chạy thời gian như bạn 11 năm mất tầm 50s tính luôn xuất excel, khi crawl data web dùng multithread thì các khả năng sau có thể ảnh hưởng đến tốc độ: tốc độ mạng (thời gian gửi request, thời gian phản hồi của server), số lượng request cùng lúc quá nhiều có thể làm thời gian gửi và server phản hồi chậm hơn, sức mạnh của CPU (số lượng luồng tối đa mà con CPU có thể gửi cùng lúc, ví dụ con I3 có thể gửi 10 luồng cùng lúc, I7 có thể gửi 20 luồng cùng lúc như vậy I7 có thể nhanh hơn gấp đôi I3, mặc dù có thể set I3 gửi 20 luồng được nhưng chất lượng mỗi luồng sẽ giảm đi phân nữa do tài nguyên không đủ), tôi nghĩ khả năng là con CPU bạn yếu + code chưa tối ưu lấy 2 năm mất có 22s mà 11 năm mất 187s (tôi thường làm với multithread thấy khi lấy càng nhiều dữ liệu thì thời gian trung bình mỗi luồng sẽ giảm xuống), tôi nghĩ nếu viết chuẩn trên Delphi có thể nhanh hơn Python vì Python mặc định chỉ sử dụng có 1 nhân CPU thôiView attachment 267351
Vâng anh phân tích em thấy đúng, hihi em không quan tâm cái chương trình nào lẹ hơn đâu, chẳng qua em thấy hứng thú, với lại có mục tiêu phải đạt được số giây như vậy em cảm thấy hứng thú code để so sánh thôi. Em lý thuyết em yếu, với lại ít có cơ hội đụng vào Wed nữa. Nên chắc có nhiều cái thủ thuật em chưa biết.
Cái chương trình này, em cũng nghĩ là nó bị thắt nút tại cái chỗ code xử lý, do tập trung quá nhiều luồng mà nó xử lý không kịp, nên nó chậm chỗ này. Em có ý định xử lý trực tiếp trên địa chỉ luồng luôn.
 
Upvote 0
Máy tôi chạy thời gian như bạn 11 năm mất tầm 50s tính luôn xuất excel,
.
Code multi thread thì CPU load cỡ 70-80%.
Mình thử chèn multi process vào multi thread để kéo hết 100% CPU thì cho kết quả nhanh hơn.
Python có thể dùng GPU để chạy script, vậy kết hợp thêm GPU thì chắc có thể tằng tốc nữa.
 
Upvote 0
.
Code multi thread thì CPU load cỡ 70-80%.
Mình thử chèn multi process vào multi thread để kéo hết 100% CPU thì cho kết quả nhanh hơn.
Python có thể dùng GPU để chạy script, vậy kết hợp thêm GPU thì chắc có thể tằng tốc nữa.
sáng này lướt qua tài liệu py thấy nó nói thế ... hình như py chỉ hổ trợ có 1 nhân CPU thôi thì phải ... nếu máy nhiều nhân có vẻ phí ... cũng đang hóc hớt py một chút xem sao .. nếu ok vọc vài tháng là chơi tạm ok thôi
 
Upvote 0
sáng này lướt qua tài liệu py thấy nó nói thế ... hình như py chỉ hổ trợ có 1 nhân CPU thôi thì phải ... nếu máy nhiều nhân có vẻ phí ... cũng đang hóc hớt py một chút xem sao .. nếu ok vọc vài tháng là chơi tạm ok thôi
Code đơn thuần thì chỉ chạy 1 nhân CPU, nên nếu CPU có tốc độ đơn nhân cao thì sẽ chạy tốt hơn CPU có nhiều nhân nhưng tốc độ mỗi nhân thấp.

Để sử dụng tối đa sức mạnh phần cứng thì Python có multithreading, multiprocessing, chưa kể dùng được GPU để tính toán (nếu máy có GPU hỗ trợ).
 
Upvote 0
.
Code multi thread thì CPU load cỡ 70-80%.
Mình thử chèn multi process vào multi thread để kéo hết 100% CPU thì cho kết quả nhanh hơn.
Python có thể dùng GPU để chạy script, vậy kết hợp thêm GPU thì chắc có thể tằng tốc nữa.
Tôi thường dùng multiprocess để chạy những case nặng để tận dụng hết khả năng của CPU, GPU thì chưa thử, lúc trước cũng từng thử kết hợp giữa Threads và process để crawl data web nhưng không thể đẩy CPU lên 100% thậm chí nó còn chậm hơn khi chỉ chạy threads riêng, nếu như bạn nói có thể kết hợp để đẩy cpu lên 100% thì để tôi xem lại cách code, hiện tại không thể test do web nó bị out hoài
 
Upvote 0
Mò tài liệu python vài ngày thì thấy như sau

1/ học py sẻ rất nhanh thôi vì thư viện họ viết cho gần như hết còn mình chỉ call ... :D :p

2/ cài py có lẻ khá vất vả ... nhiều nơi la làng khi lỗi + cài nó

3/ khó khăn nhất là phân phối ứng dụng nhỏ lẻ mà ko phải cài py thì làm như bài số 1 cũng ok đóng gói hết vào đó

xong call thì tốc độ nó cũng giảm theo + file to quá cũng hơi bất tiện chút ==> ko sao cả quan trọng là ứng dụng viết ra có đặc biệt hay ko thôi
....
 
Upvote 0
Tôi thường dùng multiprocess để chạy những case nặng để tận dụng hết khả năng của CPU, GPU thì chưa thử, lúc trước cũng từng thử kết hợp giữa Threads và process để crawl data web nhưng không thể đẩy CPU lên 100% thậm chí nó còn chậm hơn khi chỉ chạy threads riêng, nếu như bạn nói có thể kết hợp để đẩy cpu lên 100% thì để tôi xem lại cách code, hiện tại không thể test do web nó bị out hoài
Hôm nay rảnh nên ngồi test lại vụ threads và process, thì có các trường hợp như vầy:
- Kết hợp cả threads và process sẽ chậm hơn threads nếu lấy dữ liệu ít như tôi test lúc trước có thể giải thích là lấy dữ liệu ít thì đơn nhân đa luồng có thể xử lý ổn chậm hơn do phải mở nhiều process và đóng, nếu lấy nhiều thì sẽ nhanh hơn, với bài này thì nhanh hơn 10s (tức là chạy full 11 năm khoảng 40s) nhưng máy tôi chỉ mở được có 2 process, mở nhiều bị time out web phải đợi hết time out mới chạy tiếp được, trường hợp này CPU chỉ dùng được 23%
- Sử dụng process không dùng threads có thể mở tối đa số process là 61 nhưng tốc độ chỉ bằng với threads
- Sử dụng process không dùng threads+ giữ phiên (cookie) cho mỗi process+phân bổ số request như nhau cho mỗi process, máy tôi đạt tốc độ tốt nhất là 11-12s lấy dữ liệu 11 năm với 56 luồng xử lý được mở CPU sẽ lên tầm 80%1633756353144.png
 
Upvote 0
Hình như tác giả ko có ý muốn hướng dẫn nên mình làm 1 video đơn giản cho những ai thích có thể vọc python làm thư viện cho excel
1. code python:
Mã:
import pythoncom, sys, win32com.server.register, win32com.server.localserver, logging
class Controller(object):
    _reg_progid_ = "TestController.Application"
    _reg_verprogid_ = "TestController.Application.1"
    _reg_class_spec_ = __name__ + ".Controller"
    _reg_desc_ = "Python Test COM Server"
    # generate your own UID via uuid.uuid4() or pythoncom.CreateGuid()
    _reg_clsid_ = '{4E391C4B-9A49-4826-BAF0-F1AFAFD1FB19}' 
    _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
    _public_methods_ = ['hello']
    def __init__(self):
        pass
    def hello(self, name):
        return f'Hello, {name}'
if __name__ == '__main__':
    print(__name__)
    print(sys.argv)
    try:
        if '--register' in sys.argv or '--unregister' in sys.argv:
            win32com.server.register.UseCommandLine(Controller)
        else:
            win32com.server.localserver.serve([ Controller._reg_clsid_ ])
    except:
        logging.exception('Oops!')
        input()
2. Code lấy clsID
Mã:
import pythoncom
print(pythoncom.CreateGuid())
video hướng dẫn:
Liên kết: https://youtu.be/wR6nQwtEWeE
 
Upvote 0
Ai chỉ giúp mình chổ có tài liệu hướng dẫn để mình có thể làm đc giống trên với
 
Upvote 0
E có đăng ký thành công nhưng khi gọi dữ liệu thì lại bị lỗi là giá phải chạy file exe một lần nữa
 
Upvote 0
Viết thẳng trên Python lấy 1 tháng máy tôi trung bình có 0.5s, lấy từ đâu năm tới giờ thì khoảng 3s, python nó lập trình đa luồng được, VBA hay delphi phải lập trình đa luồng mới so được với Python khi crawl data web, dùng VBA để gọi có thể chậm hơn týView attachment 267308View attachment 267307
Hay quá ạ ! Lâu rồi không thấy anh xuất hiện trên diễn đàn ạ!
Bài đã được tự động gộp:

Tôi đã nói chạy thẳng trên Python, tức là dùng trình biên dịch của Python (đang dùng extension jupyter trong vs code) thì nó đạt tốc độ như vậy, bạn muốn kiểm tra thì cài Python mà thử chứ tôi chế làm gì, còn nén thành exe nó chạy chậm hơn cũng không chừng

Bạn chạy thử dữ liệu 2 năm xem máy tôi mất khoảng 9s, chạy đơn luông mất 142s , multithread khi dùng để crawl lấy càng nhiều thì tốc độ nó mói rõ rệt so với chạy đơn luồngView attachment 267326View attachment 267325
Cảm ơn anh vì biết được code hay ạ !
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom