We're sorry but this page doesn't work properly without JavaScript enabled. Please enable it to continue.
Feedback

Rust for Python data engineers

00:00

Formal Metadata

Title
Rust for Python data engineers
Title of Series
Number of Parts
141
Author
Contributors
License
CC Attribution - NonCommercial - ShareAlike 4.0 International:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal and non-commercial purpose as long as the work is attributed to the author in the manner specified by the author or licensor and the work or content is shared also in adapted form only under the conditions of this
Identifiers
Publisher
Release Date
Language

Content Metadata

Subject Area
Genre
Abstract
Python is a popular language for data engineering but has some limitations in performance, concurrency, and production deployments. The Rust programming language offers powerful alternatives with strong compile-time and memory safety guarantees. In this talk, I'll explore how data engineers can leverage Rust to build high-performance data pipelines and processing systems. I'll cover the Rust ecosystem for data work, including frameworks and libraries for working with data formats, databases, streaming systems, and scientific computing. By combining Rust and Python, data engineers can harness the benefits of both languages and build robust end-to-end data systems that scale to meet demanding production needs.
114
131
Parity (mathematics)SoftwareExpert systemJava appletSource codeRange (statistics)TorusError messageSystem programmingComputer configurationSoftware developerThread (computing)CodeAxiom of choiceSubsetEvent horizonStreaming mediaVirtual machineQuicksortMixed realityBitOnline helpType theoryInterface (computing)Decision theoryElectronic program guideFitness functionPoint cloudPhysical systemCodeAuthorizationContext awarenessService (economics)Software maintenanceEvent horizonLibrary (computing)Proper mapCASE <Informatik>InformationFormal languageJava appletArithmetic meanDifferent (Kate Ryan album)Interactive televisionInformation engineeringProcess (computing)AlgorithmCartesian coordinate systemLink (knot theory)Information technology consultingExpected valueComputer programmingMultiplication signComputer configurationError messageOperator (mathematics)Point (geometry)Matching (graph theory)MultiplicationPerspective (visual)Slide ruleLimit (category theory)Exterior algebraData storage deviceData warehouseCloud computingWebsiteFile formatExpert systemRight angleTwitterUniverse (mathematics)SoftwareBlogAxiom of choicePresentation of a groupParity (mathematics)Data miningComputer-assisted translationException handlingComputer animationLecture/Conference
Systems programming languageService (economics)CompilerSemiconductor memoryConcurrency (computer science)MereologyView (database)Bookmark (World Wide Web)Information securityFormal languageBit rateSoftwareSoftware developerForceOperations researchCountingLine (geometry)Software testingGoogolPresentation of a groupProjective planeRight angleDifferent (Kate Ryan album)Product (business)Graph (mathematics)FlagPhysical systemState of matterError messageMultiplication signFunctional programmingCodeLine (geometry)Interpreter (computing)GoogolType theoryInformation managementCompilerAdditionBinary codeWritingVideo gameCASE <Informatik>Interface (computing)Figurate numberObject-oriented programmingOperator (mathematics)Tracing (software)Configuration spaceStack (abstract data type)Library (computing)Formal languageSoftware developerCycle (graph theory)Process (computing)Point (geometry)TwitterGreatest elementService (economics)Java appletSemiconductor memorySoftware testingInstallation artConcurrency (computer science)Expert systemCodeInformation engineeringSingle-precision floating-point formatIntegerString (computer science)Run time (program lifecycle phase)Integrated development environmentPerspective (visual)Artificial neural networkWave packetBitSoftware crackingFunction (mathematics)Real numberEnumerated typeData storage deviceComputer animationLecture/Conference
NP-hardMatrix (mathematics)Software maintenanceSoftware developerPresentation of a groupTask (computing)SoftwareCodeFactory (trading post)Pattern languageAbstractionInheritance (object-oriented programming)Type theoryView (database)Model theoryStatement (computer science)Function (mathematics)Modul <Datentyp>MereologyLink (knot theory)Slide ruleNetwork topologyRun time (program lifecycle phase)BitCompilation albumRight angleWebsiteFreewareNumberFactory (trading post)Multiplication signDifferent (Kate Ryan album)Data typeTable (information)Type theoryBefehlsprozessorProjective planeRow (database)2 (number)Operator (mathematics)CodeError messageResultantSoftware maintenanceSoftware developerCurveQuicksortGoodness of fitInstallation artBookmark (World Wide Web)DigitizingSummierbarkeitInformation engineeringLibrary (computing)Interface (computing)Line (geometry)Software bugProcess (computing)Physical systemConsistencySoftware testingCompilerTask (computing)NeuroinformatikImplementationPolarization (waves)Module (mathematics)Functional programmingLogische ProgrammierspracheKeyboard shortcutVirtual machineBuildingLink (knot theory)System callFigurate numberRepository (publishing)ParsingStatement (computer science)Game controllerService (economics)Computer fileWeb browserLevel (video gaming)CuboidAdditionSource codeGreatest elementFocus (optics)DiagramComputer animationLecture/Conference
Link (knot theory)Slide ruleMultiplication signRoundness (object)Slide ruleComputer animationLecture/ConferenceMeeting/Interview
Computer animation
Transcript: English(auto-generated)
All right, so hi everyone, I'm very happy to be here today speaking about a topic that's very important to me and I've been working a while in the industry with data and all the stuff and I would like also to say hi to my girlfriend who's watching the live stream who couldn't join today. So with that out of the way, I would just like to start with some disclaimers,
right? So I'm not affiliated with EuroPython, with the Safta Foundation, the Rust Safta Foundation, any of that. I'm not a Rust expert, so this is just purely my opinion what I learned over the year that I've been working with Rust now and this is not about bashing Python, right? This is just about finding some shortcomings that Python has and how we can complement them
with Rust. Another thing is it's half an hour, so very light and condensed overview, so if you don't have time for questions, we can talk over any of the questions that you have right after. Opinions are my own and there will be a lot of memes, hopefully you'll find them funny. I found them funny at least. All right, who am I? I'm Karim, I'm French, Tunisian, living in Germany right now in Ingolstadt.
It's a city north of Munich, not many people know it, but it's the headquarters of the Audi company, right? I've been writing code since 2012, mostly Python, and I'm still enjoying it so far, so all good. I'm focusing on data engineering and operations, so making data available in the different
companies I've been working at. So I worked in consulting and ad tech for three years and automotive, many cars for four and a half years, and for the past one and a half years, I'm working at the blockchain company. My role at this company is lead data engineer, the company is called Parity Technologies, the link in the slides will be available afterwards if you want to look into it.
What I do is I manage and lead a growing team of data experts, essentially people who work with data. Our main, I would say, goal within the company is do data warehousing for on-chain and off-chain data, meaning data that is happening on the blockchains themselves, getting all of that, seeing what's going on there, and off-chain data as well, meaning data around
activity in blogs, Twitter, and whatnot. Making all of that available for the people that would like to base decisions on top of that data, right? I'm also the author of a website guide slash book called Data with Rust, which is a free guide essentially on how to do what I will show you today, a short introduction of.
Who is this for? So first, I tailored it to people who know Python but heard about Rust and would like to know a little bit more, but also for people who have slow and messy Python-based data pipelines who would like to improve those, hopefully using Rust. And maybe people who are curious and also just want to try out something new.
This is not for people who are absolutely experts, right, who know what they do, and obviously this is my cat, Vubu, who was helping me do the presentation, but he wasn't that much help. So joke aside, the agenda, I'll start by short overview. What is data engineering? For those who don't know, why even bother with Rust, right, how it is an
alternative in my eyes to, I'd say, Python's bolting on different tools approach, and the benefits of Rust in data engineering, the pros and cons, some perspectives of mine, and how it simplifies also the downstream operations of the applications that you built. Also, just like Artio showed beautifully before, I'll show how to interface
shortly Rust with Python and how that can be beneficial. And then, of course, some guidelines and some hints how to get started with Rust for data Pythonistas. So I would consider this talk a success if afterwards you just try it out, you know, you open up Rust, you try to figure it out and, you know, build some
data thing with it, and there's at least that expectation that I'd be happy with it. Okay. So Python data engineering. What is data engineering? So here, I'll show everything at once so you can read, but generally, data engineering is moving data from one place to another, processing it in between, and making it available, available for different use cases which
are not focus of data engineering, but I would say that mainly is for answering questions. How many users did we have last year compared to this year? What was the context of the activity of last year? Making that data and these insights available for anyone who wants. The main interfaces are business analysts and the business itself.
So I would say people who want to know what decisions to drive and on which data to base them on. So yeah, so data engineering generally writes data pipelines, I mean writing code that does something with data, why it's needed. So usually, data that we generate on social networks, on systems,
on blockchains doesn't fit on one machine. It fits on multiple machines and it's not easy to manage at the same time. The networking, moving the data, the processing, and making sure that thing finishes processing before the heat death of the universe. So we need to make sure that whatever it is we're doing happens
during our lifestyle. Anyway, so accessing data is more and more relevant. I don't know if you saw lately, Reddit, Twitter, everyone's closing down their APIs because they provide data that is very valuable to do things with. Data is good business. Essentially, data also has only value when it's packaged. So there's a lot of things happening, but not every data needs
to be stored and processed. Either way, what I think is very useful and why data engineering is something I really enjoy is when you gather data and interact with it, this is where you can, I don't know, get an edge either as a business or as a person or in whatever it is you do. Essentially, dealing with the data is how you get to GPT day.
Write the algorithms once, but then it's a matter of tweaking the data to get the best possible algorithms. Lastly, what I want to say is this role is at the intersection, I would say, between DevOps infrastructure. So we do a lot of Kubernetes, a lot of Docker, a lot of info stuff, but also the business. They come to us, hey, we need these insights.
We have to figure out the way back to the data. So data engineering, for now, Python is absolute king. Whatever you look for data engineering, you will find something in Python that answers that. Converting some JSONs to another data format, working with Python is, I would say, ubiquitous. You can find anything there.
There are many tutorials. There are all the libraries that you could wish for, and they're mostly up to date and maintained. So you won't have any troubles there. Requires, however, a lot of tooling. So a lot of tools that you add on to Python to make sure that the whole system works properly. And this makes it a great business because people provide those tools, build those tools, and also sell those tools.
So it's a beautiful ecosystem, I have nothing against it. But right now, it's almost the only option, I would say. For data engineering tools, however, on the other side. So if you want to build a whole system for managing data, you usually use some of the tools on the left, right? So a cloud provider, some sort of mix of, I don't know,
Kafka and S3 type storage or whatever. So mix and match of the technologies on the left. They have a common thing, though. Almost all of them, right? If you might have guessed so far, they are currently not written in Python, right? So everything that does the heavy lifting is not being done in Python and that has its reasons, which I'm pretty sure you already know.
But just to bring the point home, at the bottom right, a usual error that you would get when you work with Spark, for example. You write your Python code in Spark, you get a Java exception, what are you doing now? You're stuck. And this type of bolting on different tools for the infrastructure side introduces errors that are impossible to debug.
So there, you're at the mercy of your infrastructure team that will or will not help you fix that and meanwhile you cannot do anything. Also, now let's say you write something purely in Python and you want to improve the performance, there are some limits that you will hit if you just focus on writing Python. So essentially this is why there are some tools like Cython or other things that help
squeezing out some of the performance just by wanting to stay in Python. But essentially, if you use, for example, Spark, you would be stuck with no options if you want to improve something or rewrite it in Python. So despite its flaws, it's an excellent choice, which has available libraries as I said, growing ecosystems, events like today,
so many good things going for Python. It gets the job done and for, I'd say, 20% of the effort, you get 80% of the stuff. If something is slow, maybe adding more machines would make it fast, so these are the usual trade-offs that we can make still. And yeah, I would say it's okay if the guardrails that you have in your infrastructure, in your system,
are okay, as I said, offloading the issues to the infra team and letting them figure that out. So why even bother with Rust? I will just tell you what is Rust, so this is really not an introduction to Rust itself, but I mentioned these things that are relevant to a data engineer. So Rust is a systems programming language, I would like to say it's language to program systems, right?
And it's useful for data pipelines, so writing code that transforms and moves data, building the data tools and services themselves, you can do that too. There are many of those currently available, like Ballista or other tools where they are written in Rust, but they have interfaces with Python, so differently than something written in Java, for example.
It's also useful for developing the data libraries, like Artio just showed, so you can write something in Rust, interface it in Python, and it's working great for one use case. And of course, everything in between, so you can mix and match and use Rust for all the data engineering, I'd say, life cycle. It has many interesting features, memory safety,
it's extremely performant, supports concurrency, statically typed, and it has an excellent compiler that helps you essentially write code and avoids some type of mistakes for which you would have to write tests in Python. So, can be used to build the tools and the processing, and also, of course, it's popular, right?
Everyone's speaking about Rust, and I think if this room is full right now, it's because maybe somewhere you read that, you know, Rust is most admired language, some people, we should write everything in Rust, and even some people think that, you know, AJI will be written in Rust, right? Artificial intelligence. So, yeah, at first glance, it's good
when developers talk about it, usually in all the talks that you will find online, they will say good things about it. It's saving costs, saving money, it simplifies operations, brings huge performance boost. And also, from my perspective, it forces you to think about data first instead of, you know, what's an object or these kind of other things.
And yeah, as a running gag in the community that anything written in Rust is blazingly fast, so that's, I think, a well-valid enough point to explain what I'm saying. So I took a small Python project, like a Python data engineering project, like classically how it's set up, how I saw it being set up,
and then we will have a look at how it's set up in Python, how it looked like in Rust, and where the, you know, trade-offs and benefits are in each. So usually when you start a Python project, this is how it looks like, so you need to search, you know, set up the environment, you know, people need to figure out how to install Python, install pip, install all of that other stuff, configure their pytest, configure tux,
configure linting, configure, you know, how they want to manage their objects. There's a lot of things going on, so before you even start working with data. And this is what I mentioned when I say Python's bolt-on approach, right? You add pylint, you know, sorry, you add some typing, or you use the built-in typing within Python, but still some errors
pass through the cracks and end up in production. So the Python project, I took a few lines, I will not go through a long example, as I said, half an hour, we have 17 minutes left. You have this function here, everything works right, what it does, it counts the amount of times that all is available, is seen in hello world, right? So you build it to deploy it,
you pack it in a Docker container, get it into your CI CD, it's running, and everybody gets their data and they're happy about it. This is, I would say, the state of the infra at the time where the Python code runs, right? It run locally, but just at the end, you see actually it's a real output in the, I would say, real world. After that, a new developer joins the team,
adds a few lines of code, and it goes unnoticed, right? You can take this code, try to run it at home, add some typing libraries, some of them catch it, some of them don't, and I think that is what the big problem is when data, when you try to convert some dataset from one type to another, and these things pass through the cracks, the insights
that come at the end are wrong, right? So, again, very small example. Imagine this is, I don't know, 50,000 lines of code, and it's not very obvious where the problem is. If you didn't write the test for it, or if the typing library didn't have the test for this kind of case, you will see it in production,
you'll have a bad day, right? Now, as I said, example is not complicated. This is just focusing on typing, one simple aspect, which might be solved, some may say, in 2023, and the only time you see it is in the runtime. And I added two Twitter quotes
that I think are very, from experts in the business, that say that even with typing added in, it looks bad, it doesn't work, and why are we doing it even, right? So, next. The same thing, I would say the same project in Rust.
I'm simplifying a lot, but there is no, I would say, room for interpretation. If you want to start a project with Rust, you use cargo, which is a package manager for Rust. It will handle all the dependencies, initialize your project, and then you add the dependencies that you want to use in a project in something called cargo.tom, a manifest.
It's the requirement TXT of the Rust world. Cargo comes with a lot of functions, a lot of command line flags that help you during the preparation of the project, writing the code. It also runs the compiler in the end, and then you see the errors or the mistakes that would be caught with Rust. It helps you build the project,
so essentially it's a Swiss Army knife for everything that you would do with Rust. So here, when you start with cargo, you don't need to add any of the libraries that I mentioned previously, right? The same code in Rust, so I added for reference the Python code below. It almost reads like Python, although it's absolutely different, right? So filter, cars, why is a car different than a string,
and these kind of things. So there are some things specifically that you need to watch out for, but at the end, with a little bit of training, you can start reading code almost like you read Python. There are type annotations in both, just to be sure that things look the same, but they might have different names. Now, this new developer joins the project,
adds the same line of code as before. In a random case, it needs to call the function with a different, I would say, variable, so an integer instead of a string, and the compiler on your local desktop, not in runtime, not in production, tells you, hey, you made a mistake. Here's the mistake, please fix it. Otherwise, we're not building this stuff.
And this is how you would catch some of the errors without even writing a single test, right? So it's immediately available and it's immediately obvious that something is wrong and needs to be fixed before we can continue. This is extremely valuable with data because once you transform the data, store it somewhere, and somebody builds something on top of that data,
all of their stuff is wrong because of some errors that could have been avoided by, for example, using Rust. Again, this is not to bash about Python or the typing libraries built with Python, something like that, but it has a different approach. This is embedded in the language itself. So the same project in Rust, as I said, is focusing just on typing features.
It's already bringing a benefit. The same thing that Artio showed previously works with the complex structs and enums. So you can be sure that if you define your data in Rust code, it will be correct. Any operation you do on it will be, at the end, kind of correct, I would say. It will need a lot more work and effort to,
I would say, fool the compiler. The tooling is great. So if you run this, you will not have a Java stack trace. Maybe you have another type, I would say, of error, but then it's pretty clear where that error happened. And yeah, less need for additional tools, and the infrastructure can be simplified. Rust builds binaries or libraries that you can really attach to your, I'd say,
services that run in production, eliminating the need, for example, for things like Docker or whatnot. You just run the binary in whatever system you have. To visualize what Rust has to offer, I made a small graph. So from left to right, the easy to do the wrong thing, and right, hard to do the wrong thing.
I hope that drives the point home that these two are opposite. But if there are any questions, I can take them afterwards. I'm still, I thought this is the best way to represent it. And top to bottom is easy to do the right thing, so write the code that you actually want, and at bottom, hard to do the right thing. So you need to do a lot of things to do what you like. I would put Python on the top left.
So Python is very easy to do the right thing. You write the code, the five lines, you're done with your day, or you copy it from somewhere. It works immediately. It's easy to do the wrong thing as well, because you write the code. Python won't tell you, hey, it's wrong. It was just run it, and then you'll figure out that it's wrong. Rust, I would put at the opposite. It's hard to do the wrong thing,
usually because the compiler catches some types of errors that usually happen in running system. It's less easier than Python to do the right thing, because you need to write a lot of code. You need to consider the types. You need to fight the compiler. You need to do a lot of different things. And just as a small joke, I added JavaScript and COBOL. Of course, our interpretation can vary,
but that's what I would think of them today. Maybe in the past, it would be different, but yeah. So the benefits of Rust now for data engineering. Now, we think we have roughly 10 minutes left. So I tried to summarize it in this table and in the next pros and cons kind of table. So Rust in compile time, it will tell you, no,
I don't take this code. Python in compile time, it might catch these errors if you set up your type and your tests and whatever correctly. But you will see the problem in runtime. JavaScript, you are left to guess and you need to figure it out yourself. So the pros. Compilers catches errors early, consistent data and consistent workflows on top of that data.
It's performant out of the box even without using the advanced features of Rust like the previous talk. You can get a huge performance boost, right? It has data and typing guarantees built in. So no guesswork, no none. You just hover on the thing and you know exactly what the data type is. It has excellent tooling. Cargo covers most of the needs,
I would say in the first few years starting out. And Rust knowledge is portable. If you know how to write Rust, you would know how to build your own browser or build something for embedded devices and whatnot. So there is benefit in learning it. It gives you low level control to the system resources so to improve or to tune some of the data jobs that you have, you can use it as well, right?
You don't need to use something else. The cons, of course, simple things take a lot more time. So I wouldn't recommend it for tinkering. If you're trying to figure stuff out, try to figure them out in Python. If you want to make them run reliably, then move over to Rust. It's easy to over engineer and make absolutely unreadable. So there's a lot of like repositories outside
that you cannot parse, you cannot read. There's types everywhere. It's complicated to understand what's happening. Even simple operations are hidden behind different layers of types, right? So it's easy to overdo that. Has long compile times for big projects. So I think after you have 10 developers and you're in a huge code base, might be minutes, might be hours
depending on what you're doing. It's not immune to logical errors, obviously, right? If you write a logical error, but it's consistent with what the compiler thinks should happen, it will just run, right? But a common theme is like every bug that ever happened passed the tests, the typing and all the checks. So there's not much more we can do there.
So trade off, if you favor development speed, go with Python. If you want low maintenance, go with Rust. We wrote last year when I was joining a new company, a system in Rust is still running to this day and has zero errors. Nothing happened wrong with it. And it runs I think five or six times a day since then.
It's not much, but still some of the Python code that I wrote was less robust. If you favor performance, go with Rust. If you want smaller learning curve or you're starting out, just try with Python, try to understand what it is, writing code, and then go to Rust. If you want good developer, user experience of DX, developer UX, right?
Go with Rust, has excellent tools. You don't need to figure out how to install virtual env or if you need to install a pi project or whatever. So it's very straightforward. And I would believe the best of both worlds is using Rust with Python. Better than, I don't know, using Scala with Python or C++ with Python because of the readability, because of the tools and the simplicity.
Of course, which to choose will depend and depend also what you would like to achieve. So I'm closing in on the end of my talk and I will show you a quick example of interfacing Rust with Python. I shortened it because previously you might have seen it already, but just for the recording, I'll go over it and explain to you for a simple data engineering task,
how would that look like, right? So what we want to do is call Rust from Python and Python would be used as an interface, essentially as a keyboard and Rust as a computer running all this stuff. One of these, I would say, libraries for data engineering is Polars, essentially replacing pandas with a Rust-based implementation. Just by doing this switch in your code,
like replacing polars with pandas, you already have a huge performance boost on whatever it is you're running, you would have run in pandas. And let's see how you can do that yourself. The simple examples, we have one CSV, one million rows, right? And what we want to do is for each row, take the data, take each digit of the data,
compute the factorial, make the sum, and put it in the row of the result, right? So it's a CPU, I would say, intensive operation, not the IO bound kind of thing, where we can clearly see the, I would say, benefits of using Rust. And this is what I would recommend using Rust for. If you have something CPU bound that needs to run multiple times,
you will get improvements with Rust. And just for the record, like factorial is when you multiply the numbers up to the current number. All right, so how would you do that in Python? In Python, right, you would write something like the thing in red at the top, sum of the factorial of all of the digits,
and then add that up, write it to your CSV, call it a day. It runs 3.1 seconds, so it's just running time on this thing, and it's pretty straightforward. 17 lines, you've done your job, it's all working pretty well, I would say. Now the thing is, you need to run this a million times a day, right?
How many seconds would that take? How many services, how many machines do you need to provision to make this happen, right? Then I would say the addition starts to make sense. If you want to do it with Rust, like Artur showed, with Maturin, PIO3, this is how the files would look like. So you set up a cargo tunnel,
the dependencies of your project, and you write this sourcelib.rs file. I will zoom on it in a little bit, and this is how it looked like. In green is running the operation. It's a function that you would call within Python. At the top here, where my mouse is, there's a decorator that says, that tells Maturin and Rust that this is a function called process CSV
that I would like to call from Python later on. In red is the actual operation, right? Is actually what is going on, what we're running sequentially in Rust. And at the bottom in blue, the module definition called rustypy, where I add this function process CSV and expose it to Python at the end.
If you run this code, you will get, you see that it takes two seconds, right? And this would be the, I would say the API, the interface that you could provide to your developers or people who would use your library. They just need to put the folder and where they want to store the result. All the heavy lifting is done in Rust, and there's no shuffling from data,
from Rust to Python, Python to Rust. The operation happens in Rust. And just by doing that, we get a huge performance. Just for the reference, three seconds, two seconds, do that one million times a day, and you see that there's a huge benefit you can gain from that. And the benefit is extremely obvious when whatever you're doing either costs money or makes money
because this is the difference between, I don't know, extending your runway two years or going bankrupt in a month with your AWS bill. Either way, to recap, Python plus Rust is clearly working better than just Python on its own.
There's a little bit more code, a little bit more care to what you need to do, and Rust gives you the guarantees without any additional tools. So right now we added py03, but still we can make that work. It's possible to add, as I said, Rust data types in the mixed structs, you know, so more complex operation than what I just showed. And you can have some sort of executable data.
So you have your definitions of the data, you can see what happens, and you can predict what the results would be without running it, just by reading the code. It also, as I said, saves a lot of money. So getting started with Rust, right now the status is there are many missing tools and libraries in Rust, so huge opportunity to write some
and to, you know, establish your name within the community. The online guys are too technical, so there's benefits of making that a little bit simpler, right? A light start with Rust, if you want to start and you don't know much about it, focus on the things on the left, right? Statements, type functions, structs, you know, modules. Don't spend too much time trying to understand the Rust internals.
After a year, I still don't understand 100% how they work, but I know how to use it. And by focusing just on that, I think you will get the best benefit out of it. If you would like a light start with Rust for Python, I wrote this website where you can get started from zero. As I said, it's free, it's available, and it's task-focused, so exactly the task that I showed
explains in a little bit more depth. And I will finish this talk by thanking you for your attention and adding two links to resources, the website or my own website to learn more. So thank you very much. Yeah, thank you very much, Karim,
for inspiring us to get into Rust. That was very good for us. And I hope that you're going to post the slides in the Discord channel so that if something went too fast, you can then revisit them or maybe ask your other questions later. We do not have time for Q&A, so we just have time to ask you
to give another round of applause for Karim. Thank you very much. Thank you, thank you.