3 ms·
Almost always when I start prototyping something in python, I wish that I stopped half-way where I am now and switched to something else. Most recent example -
by galkk 2y ago
Almost always when I start prototyping something in python, I wish that I stopped half-way where I am now and switched to something else.
Most recent example - converting huge amount of xml files to parquet. I started very fast with python + pyarrow, but when I realized that parallelizing execution would help enormously, I hit GIL or picking/unpickling/multiprocessing costs.
It did work in python, in the end, but I feel that writing that in Rust/C# (even if I don't know Rust besides tutorials) in the end would be much more performant.
- deleted 2y ago[deleted]
- dmw_ng 2y ago> converting huge amount of xml files > pickling Sounds like if this is the tooling and the task at hand, about the most complex things that should be passing through the pickler are partitioned lists of filenames rather than raw data. E.g. you can have each partition generate a parquet for combining in a final step (pyarrow.concat_tables() looks useful), or if it were some other format you were working with, potentially sending flat arrays back to the parent process as giant bytestrings or similar This is not to say the limitations don't suck, just that very often there are simple approaches to avoid most of the pain
- deleted 2y ago[deleted]
- alberth 2y agoYou can quickly build prototypes with LuaJIT and it’s also quite performant. It’s worth giving it a try if you haven’t before.
- nomel 2y agoGIL has been relieved in Python 3.12: https://realpython.com/python312-subinterpreters/ https://realpython.com/python312-subinterpreters/ But, I have the same sentiment. Although, I find writing quick C++ extensions (swig is incredible) is a good balance.
- jmakov 2y agoray.io
- _niki_s_ 2y agoLooks like Mojo will fix that
- itishappy 2y agoRight, by switching languages.
- mharig 2y ago1. Pickling is, as already mentioned by a cocommenter, slow. Do not use it. 2. Do not use loops, use itertools. (Python 3.12 got a nice 'batched' function, btw.) 3. Preallocate memory, where possible. 4. multiprocessing.shared_memory may help. 5. Something like cython may help. 6. Combination of multiprocessing with asyncio (or multithreading) may help. 7. memmap file access might help. You see, you have a lot of options before you need to learn another language.
- bdjsiqoocwk 2y agoJulia
- cedws 2y agoI recently needed to do something similar and used Apache Arrow’s Go library for Parquet. It’s horrifically slow and somehow manages to leak memory. It’s also undocumented. If anybody knows a good Parquet library for Go please let me know.