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

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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 [URL='docs.python.org/3/faq/windows.html#is-a-pyd-file-the-same-as-a-dll']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 [URL='www.giaiphapexcel.com/diendan/threads/l%E1%BA%ADp-tr%C3%ACnh-trong-power-query-v%C3%A0-c%C3%A1c-v%C3%AD-d%E1%BB%A5.157214/']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é. >> [URL='drive.google.com/uc?export=download&id=1_var3X9w8aiiuQ4dNMG3VnKek85BPv-n']Tải File.

2936

www.giaiphapexcel.com/diendan/threads/python-v%C3%A0-%E1%BB%A9ng-d%E1%BB%A5ng-l%E1%BA%ADp-tr%C3%ACnh-th%C6%B0-vi%E1%BB%87n-cho-vba-b%E1%BA%B1ng-python.157885/

Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học SprinGO phù hợp

Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM

Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...

Xem khóa học
★★★★★ 5 ★ 1 👤 5 ▥ 0
Quảng cáo

Bạn nên đọc

5 Responses

  1. hands says:

    Nghe rất hấp dẫn anh. Mà chưa biết bắt đầu Python từ đâu anh ạ.

    Mình có một số bài về Python rồi đó.

    Cơ bản thì biết VBA là viết được Python rồi. Chủ yếu là đọc cách dùng thư viện thôi.
    Lý thuyết cơ bản thì tham khảo đọc ở đây. [URL='www.w3schools.com/python/']>> Python.

    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)

    hay đó lách nó qua EXE mà lỗi trên Office 365 x64
    2939
    2940

    lỗi này chắc bạn chưa chạy file đăng kí, hoặc UAC máy đang cao.

    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.

    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 đó )
    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

    chúc mọi người bàn tán vui vẻ

    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ả.

    [URL='drive.google.com/uc?export=download&id=1qjzXk7NbGmCfERw_GpezMjl_FL0tQT60']>> 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ế

    2942

    Chạy File đăng ký đi anh, e chạy file này xong thì không còn lỗi nữa.

    mấy vụ này mạnh thành thần rồi ko phải lo quá xa he

    Chắc máy đó ko phải Office 365 quá … nếu đúng thế khai báo lại trong python chút là xong thôi

    Anh thử dùng tài khoản Administrator rồi đăng ký xem được không.

    Vụ đăng ký COM Server không liên quan Office.

    Tôi đang chạy Windows 64 + Office 2016 64 bình thường. Khoái cái món này đây.

    thử các kiểu rồi … ko được

    Nó chạy đó mà call từ Excel ko dc

    2943

    Anh 'End task' nó đi. Rồi chạy file unregister.bat.
    Sau đó chạy file register.bat.

    Nếu vẫn không được thì em cũng chịu rồi. @@

  2. hands says:

    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.

    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.

    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.

    chạy đó … kéo UAC xuống mới Ok … còn tại sao thì ko biết

    2944

    .
    Em có thử ở máy tính khác, mặc định (UAC không chỉnh gì so với ban đầu) là chạy được luôn.

    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

    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.

    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

    2945

    Ruột *.pyd là C code đấy anh.
    2946
    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

    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ế
    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ịu2947

  3. hands says:

    Ruột *.pyd là C code đấy anh.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

    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)
    http://www.giaiphapexcel.com/diendan/threads/c%E1%BA%A7n-gi%C3%BAp-%C4%91%E1%BB%A1-code-vba-l%E1%BA%A5y-d%E1%BB%AF-li%E1%BB%87u-tr%C3%AAn-web-theo-ng%C3%A0y-%C4%91%C6%B0%E1%BB%A3c-ch%E1%BB%8Dn.156380/
    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

    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

    2948

    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. 🙂

    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-

    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 😀

    Gởi File mọi người nhớ sửa đường dẫn trong vba nhé

    Quả dll 11.5M ngán quá, Vb6 viết xong có vài chục kb luôn

    tự mình làm biếng xoá máy cái linh tinh, chẳng qua test choi vui thoi 🙂
    Cái này 5m

    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 á.

  4. hands says:

    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ý
    29522951

    Ú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

    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ồng
    2954

    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 )

    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 [URL='docwiki.embarcadero.com/CodeExamples/Sydney/en/TThreadList_(Delphi)']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é. 😀

    multi thread dll :p

    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ôi2955

    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.

    .
    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

    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ợ).

    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

    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 … 😀 :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
    ….

    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%2956

    Chính xác là chỗ này đó. Bài #1 mình làm vậy luôn.
    Bạn đẩy chỗ khởi tạo session kết nối tới server ra ngoài để không phải tạo lại cho mỗi luồng.

    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:

    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

    import pythoncom
    print(pythoncom.CreateGuid())

    video hướng dẫn: wR6nQwtEWeE
    [url=youtu.be/wR6nQwtEWeE]Liên kết: youtu.be/wR6nQwtEWeE

  5. hands says:

    .
    Tiếp một ứng dụng thư viên VBA bằng Python.
    Lấy toàn bộ bảng giá xăng dầu từ trang [URL='www.pvoil.com.vn/truyen-thong/tin-gia-xang-dau']PVoil.

    Link tải >> [URL='drive.google.com/uc?export=download&id=1c7yW-MjXQOcg5Lp8dQl38pKjyVbvwgrN']Tại đây.

    2958

    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

    Bạn gửi code lên xem nào, chắc nhầm chỗ nào đó thôi.

    Em gửi drive.google.com/file/d/1SqlWyrXKeQwP60XunwgjlKbTDwnqCCce/view?usp=sharing

    Với tiện cho em hỏi chút để gọi được từ scrip từ file py bên ngoài thì cần cấu hình như thế nào vậy ạ?

    Đơn giản nhất là bạn đặt chúng cùng một thư mục rồi dùng import tên_file_py là được.

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm