Startup takes around a minute (which includes installing various python libraries + loading an external 5mb dataset). But once up and running it is quite responsive. (And works fine on my iphone.)
Many businesses I work with use Tableau free versions, and just manually update the data (since the free doesn't allow direct connections to a datastore). This is a free alternative (I use github actions to build a zipped up csv file that is pulled into the environment).
Yes this is part of the price of running it client side instead of having a server do all the data manipulation. It is pretty much a wash for RAM for me vs running locally (local is 200-300 for python + 100-200 for chrome for just that web-page).
Woah, what browser/page combination can fit into ~50Mb these days? I am simply used to the fact that most pages take at least 200Mb RAM in task manager.
did you use the in browser or another external task manager? most pages without videos or some kind of gpu process uses 20~30 MB here (like hacker news for example).
On iPad Pro 13" from fall 2023, over NYC area broadband and WiFi, it takes about 8 seconds from clicking your link for the spinner (which seems to hang from seconds 4 - 8) to clear and the filters to become active.
Not sure how long bootstrapping enough Python into Safari on an iPad to run a Panel app would take, but I certainly imagined more than 8 seconds. (Shift refresh takes ~6.)
That's pretty cool. In case anyone reading this is generally interested in crime statistics dashboards, I'll link to the NYPD's: https://compstat.nypdonline.org/
This example could be all javascript (and I try to do that in some scenarios). Most of the other demo's on my site are just javascript/D3 or other libraries even with some slightly more advanced metrics, https://crimede-coder.com/demos.
There are some cases in which I do want python numerical libraries though. Say I wanted to do a forecast ARIMA model based on arbitrary combined inputs for the graphs, or do different types of spatial clustering of the geographic data. Those would be cases pyscript would make sense.
The public dashboards yes IMO easier to not have to worry about server.
There are projects that do that, but it looks like PyScript instead runs Python code directly. It uses a Python interpreter compiled to WebAssembly - either CPython (from Pyodide) or MicroPython.
> And the title says "platform". So I'm still confused.
I hate it when people say "platform" or use other vague/ill defined terms. Just say it's a JS implementation of Python that evaluates code in script tags for python, or some such.
Without actually reading the documentation or source code -- I guess "js" package is just an API that somehow maps to the real "window" object and calls those DOM methods via some sort of Proxy object.
Pyodide is a port of CPython to the WebAssembly platform. PyScript is a framework that uses Pyodide to provide a framework for developing Python applications in the browser. Its elevator pitch would be "python inside script tags via pyodide".
This uses pyodide. It's more like a Python to JS transpiler (even if it's not). It's to create browser apps using Python. So it's Pyodide + a browser API.
PyScript can use Pyodide or MicroPython. MicroPython is actually quite small.
On top of the runtime, PyScript gives you some pleasantries and a lot of quality-of-life improvements for actually using Python for web programming, not just being able to run Python code.
I recently went down the rabbit hole of using PyScript for running a Python CLI app in the browser.
It felt hacky the whole time, especially when dependencies were involved. I had to create wrapper classes to work around Pydantic 2.x not being available to use. I tried to put all logic into the Python files but found some things missing that I had to put in JavaScript.
I think it could be good in use cases where you want some simple UI with custom UI logic on top of your Python code but maybe Streamlit or Gradio could be more suitable.
I can't find any real world use case there. If you want to run ML Models you can build them to Onnx https://onnxruntime.ai/docs/tutorials/web/ . Will this efficient to build browser based app in place of JS/TS ?
TS is actually has better typing than Python (mypy). And the whole React (Vue, etc) infrastructure around it. Without these two things I wouldn't even bother writing frontend code.
Idk they're just different tradeoffs to me. Types are real and enforceable at runtime in Python (e.g, pydantic). Types in TS/JS are a fake veneer that add a build step. Is that categorically better? I don't love Python typing syntax.
I want my types to be verified before runtime, what should I do with type error at runtime? Yes it will leave me a better error message in logs, but build-time type check will prevent me even rolling this code out.
> I want my types to be verified before runtime, what should I do with type error at runtime?
It is weird to me you cannot think of uses for types and handling their errors at runtime. Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.
Also, if types are enforced at runtime logging is better, debugging is better, and you have more options for data validation and doing dynamic or metaprogramming likely more easily because you can evaluate these things at runtime. By types being built in, the language gives you a richer set of tools to work with and more options when and how to enforce types.
> Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.
What is it, they have nice error messages? I don't expect them to fix code at runtime when type error happens.
> Also, if types are enforced at runtime logging is better, debugging is better
These can't even happen with type checking in the first place.
> you have more options for data validation
In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.
> doing dynamic or metaprogramming likely more easily
This is where you lose me, I have never seen it being useful in reasonable large projects in popular languages. Dynamic or metaprogramming only works in a very specific category of languages (lisp-likes), doing it in any other language will become a problem sooner or later.
> more options when and how to enforce types
Again its only on serialization level, apart from that type checking will cover everything before runtime, it's weird to me how you can think that encountering problem later has any advantage of doing it earlier.
> What is it, they have nice error messages? I don't expect them to fix code at runtime when type error happens.
FastAPI validate both data (serialization) and schemas (used to create APIs and specs). Pydantic can also help with safe casting, not sure if FastApi uses that or not, but it is available
> These can't even happen with type checking in the first place.
I mean when you're debugging any problem or learning an API. It is nice to have rich types built in, especially while in a REPL, where you can inspect types.
> In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.
Pydantic relies on Python having types built into the language and available at runtime.
I thought I read somewhere that the Chrome team tried typed JS, found out that there was a performance hit, and they ended the experiment? Is this a continuation of that or a new effort? Sounds interesting.
Do you actually see and modify code in your browser today? I mean for like 5 years all you see in the browser is minified and obfuscated to the point its almost impossible to make any practical sense out of it.
What i would like, if i could write scripts in firefox, which act the browser, like doing the evaluation at any stage i like. At GET the page, after ALL GETs. After javascript evaluation or before.
Is there something which can do this? and with full power of python also accessible to the host?
Brython seems to be a Python => JS translator, rather than an in-browser Python implementation. Similar end result, but works in a completely different way.
AFAIK Brython cannot translate some of popular Python libraries. Python libraries, esp. Data science ones, are often the reason why developers pick Python.
If I may toot my own horn, I wrote a somewhat more opinionated, reactive, frontend framework using PyScript. It's inspired by Vue.js, a bit: https://puepy.dev
The big limitation that's very annoying with any WASM setup is that at the end of the day you still can't call many APIs or scrape sites because of CORS. Ofcourse, CORS is important to avoid XSS and the like but I wish there was a way to deal with this other than setting up a proxy to strip CORS, which then leaves you with a non residential IP that's more likely to get blocked.
I've been looking for something like this, but I'm still unsure it quite hits the spot. I think that this would be very interesting if it allows a person to run a blog like a Jupyter notebook.
I have a lightweight hack [1] that runs Python in markdown documents and can output basic images/graphs - which is embedded into static pages. The point was being able to write an article that somebody else could see the code behind it and test themselves, e.g. [2]. One of the browsers I test in is Netsurf with JS disabled. Unfortunately it doesn't look great in Lynx.
Is there alternative output is the WASM is not run? It would be good if it defaulted to a pre-run static output, otherwise users could be left with nothing?
First thing I tried was a small lambda function and it worked! Then I tried some Fibonacci with tail recursion and surprisingly that worked too. I'm impressed, because often when people reimplement the Python interpreter they get those wrong.
> Then I tried some Fibonacci with tail recursion and surprisingly that worked too. I'm impressed, because often when people reimplement the Python interpreter they get those wrong.
Reminds me of my first "tech" job (computer store/ISP/web dev shop, circa 1998) where the owner wrote some VBScript for the browser and wondered why it didn't work in Netscape.
PyScript is currently built on Pyodide, which is a “port of CPython to WebAssembly/Emscripten.” PyScript supports writing and running Python code in a browser.
Like conda I find the whole thing very confusing and slow, but I suppose it will be marketed to academics as "the thing to do web development with". It will also be soft-abandoned.
Just use Javascript, PHP or Scala like lichess.org, which is a professional website.
Also, check out PySheets (https://pysheets.app), which leverages PyScript to run Python logic in a spreadsheet UI, which is written entirely in Python. The PySheets UI uses LTK (https://github.com/pyscript/ltk), a fully client-side UI rendering library for PyScript.
The majority of that is the upfront one-off loading time for pyodide to get going along with required packages. Subsequent runs for things will be substantially faster.
Anaconda Code is what you're looking for! It's Python (via PyScript) running as an Excel plug-in, that has full access to the spreadsheet and can harness a big part of the core PyData stack (including matplotlib, sklearn, pandas, etc.)
Isn't it the same thing as a SPA or any other WASM? The only real difference now is that it is now accepted and the browsers assist with cross platform APIs (and some security) instead of pure Windows APIs. (Ok, so I made it a bit more simple than it is, but that is how I see it.)
Thats what I am thinking too. Integrating code of DS/ML people into backend is painful enonugh. Imagine maintaining frontend code of those who had never done proper forntend development...
If it's not something that needs extensive testing, I'd rather maintain that codebase than a "proper" one. Data science people don't pump out 100 files with 20 layers of OOP, and they don't know how to use Redux or whatever overkill navigation lib. It'll be a main.py that just does what you want. Maybe there will be copy-pasted code, but even that can be more readable sometimes.
Honestly, WebAssembly with C#'s Blazor is the best development experience I've ever had. I can fully debug the front-end and back-end within Visual Studio.
IMO, it's somewhat polarising. Some people love it, but I personally can't stand it. It feels too heavy, trying to dominate every aspect of writing code. I prefer lightweight editors, but I recognise it's a personal thing.
Its totally a personal thing. I feel VS Code is the right combination of light weight, light touch, and keeps my focus where I need it whilst still having the ability to get to helpers that make life easier.
Visual Studio is nice but I vastly prefer Rider, even on Windows. It feels bit snappier, especially when you're comparing Visual Studio + Resharper versus Rider. TBH this is probably a matter of what is familiar though.
MonoDevelop was also really nice. So much so, it looks like they copied it into Visual Studio for Mac???[0]
In any regard, C# has some of the richest tooling I've seen for any programming language, I do wish Microsoft would invest even marginally into MonoDevelop again.
VS4Mac is MonoDevelop. Well, it was - VS4Mac is dead now as it has been stagnating, and at the end of its life was likely more harmful to .NET adoption by developers using macOS.
Its niche is now replaced by VS Code, particularly after base C# extension switched to Roslyn LSP from Omnisharp, and, of course, Rider which has been a strong cross-platform offering for a long time.
With that said, I heard only positive things about MonoDevelop back in the day and my impression from the feedback is that it was something its authors really put care into. I suppose it is part of history now.
On Blazor - both Rider and VS Code support it. Contrary to the belief of slowly but surely diminishing group of developers that think .NET is still stuck in Windows land, there is nothing that ties you to Windows here.
Afterwards the team started to share code between Visual Studio and VS4Mac, written in .NET Standard libraries, until they started the full rewrite, using .NET Core proper with Cocoa bindings, as the team did not consider MAUI with Catalyst mature enough for the rewrite.
Only to have the project cancelled and replaced by our Electron shell friend, after they reached the 1.0 of the rewrite efforts.
Which still doesn't have the graphical tooling and storyboards integration from VS4Mac.
> Afterwards the team started to share code between Visual Studio and VS4Mac, written in .NET Standard libraries, until they started the full rewrite, using .NET Core proper with Cocoa bindings, as the team did not consider MAUI with Catalyst mature enough for the rewrite.
Do you have a source for this? I really love these historical dev tidbits. Would love to read some of the talks on it.
My understanding was that ultimately they used C++ code from the original VS itself for the new VS4Mac eventually.
You're replacing one interpreted language for another.
Yes, Python is among the slower interpreted languages out there, but still. The debate between fast execution and programmer productivity is not a new one. Given Python's popularity, I'd say it's settled.
Yes, they link to examples and all of them run way slower than the equivalent JS version. Most likely because python has to ship its interpreter in the WASM bundle.
If the user experience is significantly worse, I don't care if it was easier for you to write the code.
Runtime and download time are two different things.
Pyodide runs at least ~10MB. That's a lot for a web app to handle, for sure. The use case there is most likely either scientific computing/data science (where JavaScript is just an obvious non-starter), or it's line of business somewhere where someone downloads an ERP app and just runs it. Those are already huge, as anyone who uses the stuff from ERP companies can attest.
No one is seriously proposing that you should use Pyodide, with the whole Python standard library, to add interactivity to a regular newspaper website or something like that.
MicroPython might be a good fit for that though. It's ~100k -- smaller than a lot of JS tooling.
But usually when we say "fast language" or "slow language," we're talking execution speed, not runtime size.
I agree with the sentiment but the purpose of WebAssembly is to be a compiler target for other languages, so we're not stuck with Javascript until the end of time, right? Will this always necessarily be substantially slower than Javascript?
> Will this always necessarily be substantially slower than Javascript?
Yes, interpreted Python will always be slower than JIT-compiled JavaScript.
PyPy.js [0] is a JIT compiler for Python that runs in the browser - its performance could be similar to JS but its development is currently “sleeping”.
We must think of the lessons of docker, the lessons of conda. Why, what with the web environments, so many, is there not a way to unify an environment? Of course! A virtual environment of python, on a virtual environment of the docker machine, on a virtual web browser, and there can be JIT throughout to make it only painfully slow and not excruciatingly slow! Abstraction is a Good Thing (TM) and the more abstraction, the better. There really ought to be an object oriented abstraction layer factory generator factory using Java OOP best practices, also a good thing (TM). If all goes well we may even be able to reach abstraction tier 17, which is two more layers of abstraction than the industry standard 15.
Fun joke but Anaconda has a track record of creating OSS and then turning it over to community governance. This includes the conda tool itself, libraries like bokeh, dask, numba, jupyterlab, and many more. And while PyScript project governance isn't in NumFOCUS, all of the code is permissively-licensed BSD/MIT.
The commercial licenses for the products and commercial repository is what supports all of this OSS development work.
https://crimede-coder.com/graphs/Dallas_Dashboard
Startup takes around a minute (which includes installing various python libraries + loading an external 5mb dataset). But once up and running it is quite responsive. (And works fine on my iphone.)
Many businesses I work with use Tableau free versions, and just manually update the data (since the free doesn't allow direct connections to a datastore). This is a free alternative (I use github actions to build a zipped up csv file that is pulled into the environment).