Transcript #215: A Visual Introduction to NumPy
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:05 This is episode 215, reported January 6th, one of my favorite dates, 21.
00:10 I'm Brian Okken.
00:11 I'm Michael Kennedy.
00:12 And we have Jason.
00:13 Hello.
00:14 Yeah, hey, Jason, nice to have you here. Jason McDonald.
00:16 Yeah, it's good to be here. Thank you for having me.
00:18 Yeah, thanks for joining us.
00:19 Oh, and Brian, I think he's going to cover something we haven't really covered much on the show, GUIs.
00:24 Oh, good.
00:26 Actually, to be honest, I know this is like a longstanding joke in the show for longtime listeners, but we actually haven't covered GUIs that much recently.
00:32 But there was a long stretch where we did.
00:34 Yeah, yeah. That was probably like a year ago.
00:37 Yeah, yeah.
00:38 I like my programming projects and my brownies to be GUI.
00:41 And fudge. Come on, fudge too.
00:44 And you like bad jokes, so you'll fit in nicely.
00:47 Oh, absolutely. No, if anyone likes puns, follow my Twitter. I post an original every Monday.
00:53 Nice. I heard that there's going to be a lot of exciting news for space in 2021.
00:57 So I kind of want to bring a little space and Python together.
01:00 That's good. Yeah.
01:01 Yeah.
01:02 So the first topic that I want to talk about is this video done by a woman in the UK who is a astrophysicist.
01:11 She goes by the name Dr. Becky, which is cool.
01:14 She has a fantastic YouTube channel.
01:16 She's also a Python developer and she works in cosmology, which is pretty cool.
01:22 And she did this video that I'd just like to highlight for people who maybe are coming into Python, not from the, hey, I'm going to create a microservice set of APIs talking to Docker, but more from the, hey, I do some kind of science or data science or something like that.
01:39 And the video is called the five ways that I use code as an astrophysicist.
01:44 Cool.
01:44 Huh?
01:44 Yeah.
01:45 Yeah.
01:45 So she basically lays out the idea of as a modern day scientist, you can barely do your job if you're not doing some sort of programming.
01:54 And of course, one of the best languages, technologies for programming these days is Python in the data science space, right?
02:02 Right.
02:02 Surprise.
02:02 Yeah.
02:03 No big surprise there since 2012, I would say.
02:05 And so the, she covers five different things with examples of each.
02:09 So I thought that was just a nice way for people who are either getting into Python from a science side, or maybe they're teachers and they want people ask them, why should I not just use MATLAB or some other custom tool?
02:21 Like, let me show you.
02:22 So here's some really cool examples of real astronomy being done with Python, but it's also super accessible to even like middle schoolers, I would say.
02:32 And number one is image processing of galaxies from telescopes.
02:36 So you can do things like noise removal.
02:40 So it turns out that when you're taking pictures of galaxies, even if there's no actual background light or disturbances, just the basic disturbance in the actual sensors themselves will put little marks and imperfections in the images.
02:55 So using Python to go through and clean those up makes it much easier to get started.
03:00 And the size of these pictures and the amount of data coming in from some of these new telescopes is stunningly large.
03:07 It's cool.
03:07 Yeah.
03:07 For sure.
03:08 Another one is data analysis.
03:11 So if you're trying to find the brightness of some part of an image, say, maybe you're looking for a transit of an exoplanet, right?
03:18 You want to constantly monitor the brightness of a star.
03:21 Or in her case, what she's studying, it just blows my mind.
03:23 She's studying galaxies.
03:24 Like when you see pictures of stars and you're zooming in, you're like, oh, that's not a star.
03:28 That's a galaxy.
03:29 It's just like, you know, like I still can't really get my mind around that.
03:32 But she talks about one of her data sets that has 600,000 rows of like brightness of galaxies.
03:38 So 600,000 galaxies, they all have information about that they're comparing.
03:41 So that's pretty awesome, right?
03:43 Yep.
03:43 Model fitting.
03:44 There's an example about theory that most galaxies have a supermassive black hole in the middle.
03:51 There's also this idea that possibly the size of the black hole and the size of the galaxy, these things kind of grow in mass together.
03:57 So she has all this data.
03:58 She's like, well, let's do some statistical fits of black hole size and galaxy size.
04:03 Also, the color of galaxies can indicate the relative speed or rate of star formation.
04:09 And the age.
04:09 And the age.
04:10 Exactly.
04:10 Yeah.
04:11 All tied together.
04:12 And so she's using Python for that.
04:14 Finally, data visualization, you know, pretty straightforward, but in drawing graphs and pictures.
04:19 And the last part that was my favorite part is simulation.
04:22 So there's two really cool examples.
04:24 What happens if a star gets too close to a black hole and gets, she said, spaghetti-ified?
04:30 That's cool.
04:31 And the other one is examples of galaxies colliding, which is just, again, mind-blowing.
04:37 But really cool computational examples of all that.
04:40 So I wanted to highlight this video because it's super accessible, but it's also really neat to show concrete examples of real science being done with Python.
04:47 Yeah, I thought it was cool when she was talking to her colleague about building the simulations of the universe.
04:53 You know, you have a simulation of the universe.
04:55 Where do you start on that?
04:57 It's like, we think we have project blocking.
05:00 You know, it's like you start on a project.
05:02 It's like, yeah, I'm just going to build a tool.
05:03 Where do I begin?
05:04 It's like, I'm going to build a simulation of the entire universe.
05:06 Where do I start?
05:08 Exactly.
05:08 I'm going to simulate gravity at a galactic scale.
05:12 Let's just do that.
05:13 Yeah.
05:14 Awesome.
05:15 So if people are out there and they're interested in this kind of stuff, yeah.
05:19 This is all in one video?
05:20 Yeah.
05:21 This is all in one video.
05:22 Yeah.
05:22 Robert says star or galaxy.
05:24 It's big.
05:25 Yeah.
05:25 They're both huge, but obviously, man.
05:27 It's just like, I can't get my head around like galaxy-sized stuff.
05:30 It's so insane.
05:31 Star is a primitive type in the universe.
05:35 And then a galaxy is a collection.
05:38 That's what I just immediately go to right there.
05:41 Yeah.
05:41 Exactly.
05:41 Yeah.
05:43 So Brian, it's like a 15 minute video that half of it is the stuff that I talked about.
05:47 Then half is what Jason touched on.
05:49 She actually interviews one of her colleagues who basically does the more, the simulation side
05:54 of programming.
05:55 That's pretty cool.
05:56 Yeah.
05:56 Yeah.
05:56 I'll have to check that out.
05:57 Yeah.
05:58 It's definitely worth it.
05:58 Yeah.
05:59 I enjoyed it.
05:59 I don't do very much data science actually at all.
06:01 And so it's like, you know, understanding, seeing data science stuff is always interesting because
06:06 I, but most of my work is in like application development.
06:09 I don't usually work with a lot of data.
06:10 So it's the, that side of it explained in this really cool, relevant way.
06:14 And said, I was like, well, the statistics is a number of people, you know, who, you know,
06:17 buy, you know, cheese every weekend that the supermarket is not interested galaxies.
06:22 Exactly.
06:22 Getting better click through rates on your ads is not, not super compelling, but I think
06:27 it's really valuable to see alternate perspectives, right?
06:30 We all get into our own little world of like, this is what programming is.
06:33 This is what Python is for.
06:34 And then, you know, it's, it's bigger.
06:36 I want to talk about NumPy a little bit.
06:39 All right.
06:39 Tell us about it.
06:40 Well, I've, I've, I actually, I've used NumPy off and on a lot.
06:43 And it's definitely a staple scientific use of machine learning and sorts of stuff, but,
06:48 but I'm starting to use it more.
06:50 And I've realized, I realized that I, I had the wrong mental model.
06:54 So I like think of arrays kind of just like lists, but different.
06:58 And so I came across this article.
07:01 It's a couple of years old, but it's a visual intro to NumPy and data represent.
07:05 And to me, it really helps a lot, like to, to help me understand what you can do with
07:10 it and just have a good mental picture of what, what the arrays are in NumPy.
07:15 So it talks about arrays, matrices, and, and, and, and D arrays, which are in dimensional,
07:20 but like, for instance, I'm even just creating an array.
07:23 I knew how to create an array.
07:25 I mean, you just kind of initialize it with a list and you get an array, but I didn't know
07:30 you could do like, just say I want a list of ones or a list of zeros.
07:35 Or an array of ones or just a random array pre-filled with random numbers.
07:40 That's pretty.
07:40 And then he talks about, you know, arithmetic you can do with them and slicing and stuff.
07:45 You know, Brian, like when we talk about Pythonic code all the time, like, oh, you could write
07:49 code in this way where you kind of hack a numerical for loop, but you should do this other way.
07:54 And that would be more Pythonic.
07:55 I suspect there's also a.
07:57 A NumPy way.
07:58 A NumPy way, right?
08:00 Yeah.
08:00 Sort of like filling up stuff.
08:01 You're like, oh, you should just do ones on this one.
08:03 And then then, you know, you always like there's a lot of cool other ways of sort of
08:07 conceptualizing things.
08:08 Right.
08:08 Yeah.
08:09 Well, and it's worth remembering.
08:11 You know, I've said this quite a few times.
08:13 Not here, obviously.
08:15 But I regularly like to remind people abstractions are there to save us typing, never to save us
08:21 thinking.
08:21 It's like it helps to have that mental model, as you put it, Brian, you know, straight.
08:26 Because if your mental model is wrong, it can really wind up.
08:29 Well, you're prone to both cargo cult programming.
08:32 Well, I do it this way because it's the way I was taught.
08:34 Or trying to, you know, ill fit a pattern that's familiar to, you know, the wrong sort of problem
08:40 and you don't realize what it is you're really working with.
08:42 So understanding what's happening under the hood, even if, you know, you don't know all
08:46 the technical details of the implementation.
08:48 So understanding how it's doing things is important to, you know, choosing the right job.
08:52 Idiomatic patterns always.
08:54 Yeah, yeah.
08:55 And you'll hear stuff like, oh, well, Python is slow.
08:56 It's like, well, because you're doing it wrong.
08:58 Don't do it that way.
08:59 For example, use something like NumPy, right?
09:01 And like, for instance, one of the things I really loved about this article was the explanation
09:05 of dot product because I've heard this before.
09:08 I've never had to use a dot product, but it like somebody described it to me several times
09:12 and I'm like, yeah, okay, weird.
09:14 But then like the visual representation of it, I like just stared at it and read it for like,
09:20 you know, 30 seconds.
09:21 Oh, that's easy.
09:22 Now I get it.
09:23 And I'll have it forever now because of that sunk in there.
09:26 Pretty good.
09:27 Yeah, that's awesome.
09:28 One of the reasons why I went to it, I have this problem is that I have like large arrays,
09:35 but they're not like huge.
09:37 They're like in the thousands, say, of numbers.
09:39 And I need to make sure that one array is like comparing to another.
09:44 I know equal works, but I wanted to compare item by item to make sure every element is less
09:50 than the other element in the other array, less than or equal.
09:54 I didn't know how to do that.
09:55 And I'm like, I think NumPy would probably do that easy.
09:58 Can you do one NumPy array less than the other?
10:00 Yeah.
10:01 Yeah.
10:01 So if you say less than, it compares it element by element and it gives you a list of true
10:06 or false.
10:06 And then you can do all.
10:08 Yeah.
10:08 Do an all on it.
10:09 Yeah.
10:09 Just say all of these two arrays less than or equal to each other.
10:13 And I get exactly what I want.
10:14 They're very expressive, simple line of code.
10:17 Yeah.
10:17 It's that kind of stuff I was thinking of when I was talking about like the NumPy, NumPy
10:22 way or whatever.
10:23 Idiomatic NumPy.
10:24 Thank you.
10:25 It's like, that's like one or two lines and it's really fast.
10:28 Whereas you could loop over each item individually and it not only is more code, but it's also
10:33 slower.
10:33 Yeah.
10:34 Well, and also I like, I also have to, I like that there's the intermediate step of that.
10:38 There's gives me a list of true and false too, because I also on the debugging side,
10:43 I need to be able to like wrap this in something and pick like, say the first five elements
10:48 that are not matching.
10:49 I mean, I don't want, if I, if, if it, if it's false, the whole statement's false.
10:54 I don't want to like just say, you know, list all the thousands that are wrong, but I, I want
10:59 to be able to like list a few to say, at least these are not in the right.
11:02 Yeah.
11:03 Yeah.
11:03 It's good.
11:04 I'm going to try out NumPy now.
11:05 Hey, I now have a reason to try it out.
11:08 Exactly.
11:09 Like, why am I not using this in certain situations?
11:12 Magnus, the live stream says, two dimensions is okay.
11:15 Three is hard, but in that, then my mind blows.
11:18 Yeah.
11:18 I actually did a bunch of math research and four dimensional stuff, two dimensional, but
11:22 complex numbers.
11:23 So four dimensional sort of, and yeah, it's just, it's just hard.
11:26 Well, what one, one of my weird nacks as a programmer is I actually can think in six
11:30 dimensions.
11:30 It's it's, I mentioned before the podcast, I had a head injury a few years ago.
11:33 So I'm a minor traumatic savant.
11:35 I can think in six dimension.
11:36 And the best way I can explain it, if you're trying to do it without having a really bizarre brain
11:40 like mine is think of, think of the fourth dimension as a timeline.
11:45 And for each timeline you have, you have space represented as a cube, but then you have this
11:51 row of cubes, which represents the timeline.
11:53 It becomes a lot easier to think of four dimensional race when you think of it in that fashion.
11:57 Yeah.
11:58 And the way that we did it, we actually had animations of that three dimension thing and
12:01 the animations were moving through that, that bit.
12:03 Yeah.
12:04 But still it's, it's, it's no easy, no easy thing.
12:07 Yeah.
12:07 It's easier when you're an animator to wrap your head around 4d than if you're just a, you
12:11 know, an ordinary run of the mill programmer like most of us.
12:14 Brian, would you say that that's a gooey type of solution?
12:17 no.
12:18 Maybe you could do something with cute.
12:21 Yeah.
12:22 Yeah.
12:22 Okay.
12:22 Oh yeah.
12:23 I don't know.
12:24 Yeah.
12:24 Jason.
12:25 Yeah.
12:25 Who knows?
12:26 It's possible.
12:27 So, that's our next topic.
12:29 Take it.
12:30 Grab it, Jason.
12:30 Yeah.
12:31 Well, okay.
12:32 Well, I, I, so I was really excited to discover the cute six just released on December
12:36 8th.
12:37 So, cute.
12:38 Yeah.
12:39 It is officially pronounced cute.
12:40 Although it's much, it's very debatable.
12:41 People like, Oh, it's cutie.
12:42 It's cute.
12:43 Come on.
12:44 Yeah, exactly.
12:45 Anyway, whatever you're going to call it, it just released.
12:48 and this includes the Python binding.
12:50 So, pie side six, Shabokan six, which is the, so pie side two was cutie five,
12:56 as if that made sense.
12:57 Pie side six is, is cute.
12:59 T six, cute sexy.
13:00 Now I'm doing it.
13:01 Anyway, so that just released.
13:03 and you also have the pie cute T six, if you prefer, Riverbanks version, but in
13:09 whatever case, you're going to wind up with, with all the, all the cute six features.
13:13 I think the, the coolest thing here is if you're doing, if you're doing like,
13:18 you know, really fancy sort of, graphics is that, previously, cute five and prior
13:24 had this hard dependency on open GL and they've actually put in a, what they call the rendering
13:28 hardware interface.
13:29 So it's an abstraction layer into, into cute.
13:32 So now, it can natively support whatever the 3d graphics driver is on that device, whether
13:37 it's direct ax, bulk in metal, whatever, whatever you want it to work with, but uses the native
13:42 by default.
13:42 You could, you could tell it to use whatever, whatever you want.
13:45 that is so cool.
13:46 Yeah.
13:47 and there's a bunch of other optimizations and fixes to have in here.
13:51 I am really excited because I discovered, and this was actually introduced in five 15,
13:57 but they now support snake case for those of us who are like PEP 8 addicts who really
14:03 hate the fact that cute kind of seemed to force you to use the camel case.
14:06 You can use snake case.
14:08 There is a, there is a, a setting for it.
14:11 you can also use properties instead of getters and setters as a cute X.
14:15 So you can just rely on properties and that is, it makes it a lot easier to write, you know,
14:21 idiomatic Python code that is cute, which is fun.
14:24 Well, it just feels wrong to write, you know, get with, set with all those things.
14:29 They also have this cool thing called property binding where you can actually link those together
14:33 now too, is like you can link the width and the height.
14:35 So when you change the width, height automatically changes.
14:37 Nice.
14:37 Yeah.
14:38 I really want to build some stuff with cute.
14:40 I've, I've got a few app ideas in mind.
14:42 What I don't have is time.
14:44 Sadly.
14:45 Can you help me with that?
14:46 Jason, can you tell me to have more time in my life?
14:48 I, I, I, I know I have a reputation as a time Lord, but unfortunately I can't control the
14:53 stream of flow of time there.
14:55 If I find my TARDIS, I'll pick you up and, and, and drop you off, you know, 10 years ago
15:00 and you can relive those 10 years and do additional things.
15:02 Okay.
15:03 Yeah.
15:03 Nice.
15:03 Nice.
15:04 That would be, yeah.
15:05 Yep.
15:05 let's see, actually a couple of questions from the live stream.
15:09 Magnus asks, any news about cute going mobile?
15:12 I actually am ashamed to admit.
15:15 I don't know.
15:16 I don't know either, but the, I think the bigger, more interesting question would, could PyQt stuff
15:23 like could, would, could, would you be able to write a Python cute application and make it
15:27 mobile?
15:27 Right.
15:27 I think that's where it gets really interesting.
15:29 cause there's other, if you pick another language like C++, there's other options
15:34 you might be able to choose.
15:35 And then, maybe, you know, this one you're going to ask, are there any well-known Python
15:39 apps built with cute?
15:41 Oh yeah.
15:41 Yeah.
15:41 Yeah.
15:41 They're, I'm on the spot.
15:42 I'm trying to think of what mine.
15:43 It's not well known, but I built time card in cute.
15:47 If you look up, if you look up time card, it's just a time tracking, app that
15:52 I, that I built, but actually there's, there's, there's quite a lot built, built with cute.
15:56 I didn't want to K in front of it.
15:58 If you're, if you're into KDE, the entire, the entire KDE stack is built on top of cute.
16:04 And there's actually quite a bit of it.
16:05 So, names are escaping me off the top of my head here, but, yeah, there's any,
16:10 anything in the KDE universe is, is cute.
16:14 And so you're either going to get C++ or Python.
16:16 Python is certainly a lot faster, right?
16:19 So, oh, filezilla apparently is built.
16:21 You know, one that I know that's written in it, for sure that I, it's like one of my
16:26 favorite apps actually is, Robo Mongo or Robo three T it got renamed to.
16:30 I believe it's just C++ it's not Python cute, but that one's a really nice one
16:36 as well.
16:36 Actually, there's a huge long list.
16:38 I'll put it in the show notes over here, of a bunch of apps written as well.
16:43 So it's definitely a lot easier to write, write, something in KDE.
16:47 I've, I've used a lot of different UI toolkits and KDE's definitely one of the easiest.
16:50 Yeah.
16:51 The thing that I like about it is it looks like it belongs because so many apps you build with
16:55 these sort of cross platform things and it's just like, well, okay, well that's not how
16:59 the file dialogue is supposed to look.
17:00 You just know it's alien, but you're like, no, no, this looks, this looks like it belongs
17:04 here.
17:04 Well, and packaging is the other half of it because like I tried to build something with
17:07 Kivi and I love Kivi from a, from a development standpoint.
17:11 It's really cool.
17:11 From a packaging standpoint, it's like beating yourself to death of the wet trout.
17:15 So, and, and actually if you're going to do cross platform, then, actually,
17:21 GTK is horrible too, because it's really hard to get it to package on windows.
17:25 A lot of times it just works.
17:27 It just packages everywhere, which.
17:28 Yeah, that's great.
17:29 Nice.
17:29 Nice.
17:30 All right.
17:30 Brian, I think this episode is brought to everyone by us.
17:34 Wonderful.
17:34 Yeah.
17:35 So we are, we're doing a lot of work out there and as everyone probably knows, if you're
17:40 into testing, check out Brian's pytest book.
17:42 If you're looking to take a Python course, we are just about to pass 200 hours of Python courses
17:49 over at Talk Python training.
17:51 I'm working on a new course, how to build web apps, not web APIs, but web apps with FastAPI.
17:56 Super neat stuff.
17:57 So that's, that should be out in a week or two.
17:59 So anyway.
18:00 Yeah.
18:00 I'm also, I wanted to bring up that, there was kind of a spike in, pytest books.
18:05 Sales in last, last quarter of 2020 and hoping that like some screws in it, right?
18:11 Testing other teaching.
18:13 So yeah, that'd be super cool.
18:14 Yeah.
18:15 It's nice to see more, more, more, more stuff about stuff other than unit test.
18:18 I mean, unit test has its place, but I, when I wrote the chat, I've got a book coming out
18:22 in May and when I wrote the chapter on testing and one of my editors was like, thank you for
18:25 not forcing me to edit yet one more unit test chapter.
18:29 Nice.
18:30 What's your book on?
18:31 Oh, my book's called a dead simple Python.
18:33 It just, it, it introduces the language of Python, the idiomatic practices of Python
18:39 to people who are coming from another language.
18:41 So if you don't want to have to sit through yet one more explanation of what a variable
18:45 or a function is or a class is, you can pick this up and it dives straight into the, the,
18:50 the fine details of why idiomatic patterns are what they are in Python.
18:54 Nice.
18:54 That's yeah.
18:55 That's a good idea.
18:56 I, I, the courses or books that say, we're going to pretend, you know, nothing about the
19:00 world and we're going to force you to go through everything from scratch every time that drives
19:04 me crazy.
19:04 You know, what else drives me crazy, Brian is, when my Python GC is doing stuff when
19:10 I know that it doesn't need to do stuff.
19:12 Yeah.
19:12 I like to not have to think about the garbage collect.
19:14 And you generally don't, right?
19:16 Like one of the things that genuinely surprises me is the fact that we don't really talk about
19:21 memory very much in Python.
19:22 It's like, Oh, okay.
19:23 I think it cleans itself up.
19:24 That's good.
19:24 Now what?
19:25 Let's go.
19:25 Let's go about stuff.
19:26 Right.
19:26 But if you dig into it, it's pretty interesting.
19:29 There's a lot of stuff around allocation we've covered before, but it's quite unique.
19:32 but Python's also somewhat unique in the sense that it has like two modes.
19:36 So it has reference counting, which I would say 98% of all like memory management cleanup
19:44 stuff is in the reference counting side.
19:45 This is totally made up these numbers, but there's a little, there's, I would say maybe
19:50 even more like 99.5, unless you're building some kind of a certain kind of app, like with
19:55 interesting algorithms, most apps don't create cycles.
19:58 And the only reason we have garbage collection in addition to the reference counting is to
20:03 catch those cycles, right?
20:04 you know, I've got a customer object.
20:07 I've got it out of a SQLAlchemy database.
20:09 It has a relationship over to the orders.
20:11 I go to the orders.
20:12 The orders have a link back to the customer.
20:14 Maybe like traversing that lazy loaded list has created a cycle and now I need the GC to save
20:19 me.
20:19 So the rule for when the garbage collector runs is you can ask it.
20:24 You can say, import the GC module and say GC dot get threshold or thresholds.
20:28 I can't remember a singular or plural on my screen.
20:31 If I would switch to a singular get threshold, it returns three numbers.
20:35 they're not the same units, which makes them really hard to understand.
20:38 The first number is how many allocations of collection objects.
20:42 So classes, dictionaries, lists, tuples, things that could contain other stuff.
20:47 So things that could potentially be participants in a cycle, like numbers and strings are not
20:51 even considered by the GC.
20:52 But how many allocations of collection types are there that exceed the reference counting
20:58 deallocation?
20:59 So if I had a list and I put a thousand classes, class objects in it by allocating and filling
21:05 it up, then I would hold on to a thousand and none of them would have been come become garbage.
21:08 So the first number that comes back is, well, how big is that number before we just run a
21:12 GC no matter what?
21:13 And the default is 700.
21:14 So my example there, if I create a list of a thousand objects, that's a GC that's going
21:19 to run.
21:19 It doesn't matter if there's cycles, there's no cycles.
21:22 It just doesn't matter.
21:23 Like I've made a thousand of them.
21:24 That's over 700.
21:25 So we're going to run a GC.
21:26 And then the rest are like, how much do you run?
21:28 Like a whole memory GC versus a local, a small, like recent object GC.
21:32 And what occurred to me is, you know, my website, there's a lot of pages that pull back thousands
21:36 of items and any website that uses the database and an ORM that pulls stuff back and hangs on
21:42 to it and not just like streams over the items, but puts them maybe in a list or something
21:46 temporarily.
21:47 Anytime you do that more with a thousand, you're going to have the GC run, right?
21:51 They're just looking for anything to throw away, basically.
21:53 Yeah.
21:54 But you know, you're still in the process of building the list of them.
21:57 I got to get 10,000.
21:59 Well, guess what?
22:00 That means you're going to have 14 GCs and you're just in the process of building the
22:04 list.
22:04 I'm like, that's kind of weird.
22:05 That, that, that seems excessive to me.
22:08 And then I went and looked at the site map on Talk Python training where we're pulling
22:11 back like thousands of transcripts and all sorts of stuff to generate all the pages on
22:15 there.
22:15 77.
22:16 There's 77 GCs to render the site map.
22:18 There's no cycles.
22:19 There's not one.
22:20 So I'm like, that's not good.
22:21 Well, let me think about that for a second.
22:22 So what I ended up doing was I said, well, what if I made the threshold 10,000?
22:26 Actually, I ended up on 50,000.
22:28 So only run the GC if you get more than 50,000 allocations without deallocation.
22:33 What was really interesting is doing that made my unit tests, which were including many,
22:37 many integration tests on Talk Python training run 10 to 12% faster.
22:42 Just setting that one line.
22:43 And it basically does not use more memory in my case.
22:46 Is that crazy?
22:47 Well, it makes sense.
22:48 Most issues of performance just come down to memory and how memory allocation is deallocation.
22:56 I spend almost all my time in C++, more time in C++ than I do in Python.
23:00 And we don't have a garbage collector over there.
23:02 So you have to do all this manually.
23:03 And doing it right.
23:05 You know how much work it is, right?
23:06 Yeah.
23:06 Yeah, exactly.
23:07 It's like doing it wrong is why stuff's slow.
23:09 People are like, well, Python's slower than C++.
23:11 So it has the potential.
23:13 People's has the potential to be faster than Python.
23:16 But it really depends on how you write that code.
23:18 Because well-written code is always going to run faster than poorly written code.
23:22 It doesn't matter what the two languages.
23:24 Yeah.
23:24 Yeah.
23:25 And I realized that in my world, in my type of application, I almost never create cycles.
23:30 But I often get back more than 700 class objects, which also have dictionaries potentially in the mix as they're allocating the converting, serializing into classes.
23:40 There's got to be a lot of places where that's happened.
23:42 So I just set this number to say, you know what?
23:44 Let's waste a little bit of memory.
23:46 And if there are cycles, we'll come back and get them later.
23:48 And because there's almost no cycles, there's almost no memory growth.
23:51 For example, so the server is running like eight worker processes, one of them.
23:55 And I made this change.
23:57 And I think over after running for a week without restarting any of the processes, it went from 1.89 gigs of memory usage to 1.91.
24:05 So like 220 megs.
24:07 I think it was 20 megs more memory usage.
24:09 And yet like 10% speed up by just changing like one call at startup.
24:14 It was insane.
24:14 Well, and think about what Dr. Becky's code is.
24:17 You know, like, you know, go back to the astrophysicist, you know, thing here, you know, with the sizes of data structures that she's doing or any data scientist who's listening, you know, they're usually dealing with 10,000, 100,000 million items.
24:29 You know, you combine this with all the stuff that we talked about with NumPy and with data processing.
24:34 And, you know, we talk about how long it takes to do some of these data regressions.
24:37 How much would this be?
24:38 Yeah, exactly.
24:39 So if that data is being done in Python and it's not just purely being pushed down into the C data science layer, then yeah, that's really interesting, I think.
24:49 Although I would caution at the same time that there's no such thing as a magic bullet.
24:55 So you have to understand why this is going to speed things up.
24:58 Well, I have to just copy and paste that line that my colleague has that he got from Michael Kennedy because it'll make the code faster.
25:04 No, you have to know why it's going to go faster.
25:07 It's an easy test.
25:08 Some cases it makes sense.
25:09 People can check it out.
25:10 I thought it was really, it just so surprised me.
25:12 I just walk along and I'm like, wait a minute, that must mean something weird is going on.
25:16 And then I put it on just on one of my pages.
25:18 Like, why would I do 77 GCs on a single page load?
25:21 That's crazy.
25:21 And so I just started exploring this and here we are.
25:24 So did you, whatever you're linking to, does it talk about how you can test how many garbage collections?
25:30 Let me see.
25:32 I'm linking to a Twitter thread and way deep down.
25:36 No, but there is a way to do it.
25:40 If you, if you go to the GC, you can say, I think it's set debug stats or something.
25:44 I'll, I'll look it up real quick while we're talking.
25:48 I'll throw it in at the end here.
25:49 But yeah, it's, there is a way to do it.
25:51 Actually, I got it right here.
25:52 Hold on.
25:53 Give me just a sec.
25:53 The way you do it is you say GC dot set underscore debug, and then you pass in numeration and the
25:59 value is GC debug stats.
26:01 Okay.
26:01 So that thing was just lighting up my, you know, when I turned that on, it would just light
26:05 up and just completely fill this, the terminal with the debug or, you know, GC, GC, GC, GC,
26:11 GC over and over and over when I hit the, that one page and then changing it, guess what?
26:15 Made it better.
26:15 Yeah.
26:16 Now we should probably be PC about the GC and call the garbage collector, the, the, the,
26:20 the, the programmatic sanitation engineer.
26:23 Right.
26:25 Well, it, it, it doesn't have, it doesn't, it doesn't take offense.
26:29 It's just there to help us out.
26:31 Brian is probably a pretty awesome library.
26:34 Honestly, the GC library.
26:35 Probably, but it's built in.
26:37 Yeah.
26:38 So I'm, you know, of course I'm susceptible to click on a listicle, but the.
26:44 Who isn't?
26:45 Come on.
26:45 Right.
26:45 But we don't cover them very much, but I really like this.
26:48 So this, this article is a top 10 Python libraries of 2020, but their criteria was interesting.
26:54 The criteria was, it has to be a library that was launched or popular.
26:58 It has to be well maintained as have maintenance changes since their launch date.
27:03 And it has to be just outright cool that you should check it out.
27:06 So I'm going to go through a handful of these.
27:09 They listed 10.
27:10 I don't know if all of them, since I'm, there's like four of them that are machine learning focused that I.
27:16 I think cool is relative.
27:17 Yeah.
27:18 But the first one, I, the first one was typer and I can't, I'm like, I'm, I'm really a fan of typer now.
27:25 Is it really just 2020?
27:26 And I went back and look.
27:27 It was released like, yeah, in December of 2019.
27:30 So Sebastian Ramirez is killing it for sure.
27:33 And then I looked in it.
27:34 I'm like, well, FastAPI, when did that come out?
27:36 Well, that was the previous December.
27:37 So, the end of 2018 released FastAPI and then typer a year later, he's just crushing it.
27:45 Yeah.
27:45 So yeah, nice.
27:46 both a huge fan of both of those, a big fan of rich also.
27:51 So rich, actually just showed up this in last year in 2020.
27:55 and rich is a beautiful, beautiful formatting in the terminal.
27:59 And yes, it's a beautiful, it's really great.
28:03 Let me use that.
28:03 That's glorious.
28:04 I'm even using it even in applications where I just need these, the tables.
28:09 So if you need to print out a table in the command line, the, the tables, tables are kind of hard and there were like weird other, there were other table, specialized table libraries.
28:19 but this one is great that you can, it works.
28:23 You don't have to specify the width that like comes up with the width on its own.
28:27 And then you, if you, you shrink the terminal to really narrow or wide, it'll word wrap correctly and stuff.
28:34 and that's kind of incredible.
28:37 so even if, even just for tables, I would.
28:40 Yeah.
28:40 Which is awesome.
28:41 The third one is dear pie gooey.
28:43 I think we covered this.
28:44 Maybe we could.
28:45 I don't remember.
28:46 I mean, we did go on our gooey rant, so it feels like it should be.
28:49 Yeah.
28:49 So it's a, a, a gooey project.
28:51 the, nice pictures though, at least.
28:55 Yeah.
28:56 Yeah.
28:56 I've been drooling over, I've been drooling over dear I'm gooey for a while.
29:00 I haven't, I haven't had an opportunity to use it yet, but I've been looking at it.
29:02 So.
29:03 Yeah.
29:04 So, the last few I want to highlight pretty errors looks neat.
29:08 I haven't tried that yet, but it's, it's a way to, yeah.
29:12 That is glorious as well.
29:13 Better tracebacks.
29:14 so.
29:15 I mean, ideally you don't show errors to people, but if you're going to, let's make them at least
29:18 readable.
29:19 This is great.
29:20 And let's treat ourselves too.
29:21 You know, it's like, you know, we're going to have to read the, we're going to spend at
29:25 least half our life reading error messages.
29:26 Face it.
29:27 So let's at least make it readable.
29:28 Yeah.
29:29 And another quarter crying about the, what we just couldn't figure out.
29:32 And then the last two that I want to highlight is diagrams and scaling.
29:37 diagrams is a library.
29:40 Look at that, picture.
29:41 it's a way to do, it's intended for like, cloud architecture drawings.
29:46 but the, it's written in, in Python.
29:49 You, you write these diagrams in Python.
29:51 and so because they're text, you can check them in and with version control.
29:57 That's cool.
29:58 which is nice.
29:59 I'd like to see these sorts of diagrams look more would be great for not just, you
30:04 know, network diagrams, other diagrams.
30:06 Flow charts would be great.
30:08 I still flow chart.
30:10 Yeah.
30:10 Yeah.
30:10 Yeah.
30:10 So the last one is scaling, which, is a, memory CPU and memory profiler in Python
30:16 that, handles multi-threading well and distinguishes between Python versus run for use.
30:22 Oh, that's, pretty cool.
30:24 Like definitely need to try this out.
30:26 I also like that you don't have to modify your code.
30:28 Yeah.
30:29 That's really cool.
30:31 Yeah, absolutely.
30:32 Yeah.
30:33 Those are cool.
30:33 there's a bunch of great ideas there.
30:35 And man, I really need to find a use for rich solution.
30:39 I'm going to source of a problem again, but Hey, I mean, I write a lot of like a little
30:42 terminal apps and stuff.
30:43 And I'm just like, you know, maybe you'll put a little color in here or something.
30:46 And just, you know, I just need to take the time and go, no, this is a UI that I should
30:50 pay more attention to.
30:50 Not just some random thing with text.
30:53 Yeah.
30:53 Well, we'll find this cool stuff.
30:55 It's like, I want to, I want to use, I feel the need to use this somewhere.
30:58 Well, I had a little, so I had a little application where it's just like I said, with the
31:03 tables and, and I'm like, I don't think it needs colors.
31:06 I'm just showing a table.
31:08 but the default for rich is to show colors.
31:11 So, and you don't have to pick them.
31:12 It just, so the, like the, the heading and the lines between were like different colors
31:18 if you're on a color terminal.
31:19 And if you're not on a color terminal, it works anyway.
31:21 It just figures that out for you and lovely.
31:24 Love it.
31:24 Yeah.
31:24 That's awesome.
31:25 It's awesome.
31:26 It's very awesome.
31:27 Awesome.
31:27 Speaking of awesome.
31:28 So, PEP 518 rolled out a while back.
31:33 I was introducing this thing called a pie project.
31:36 T-O-M-L, I guess it's called a pie project.
31:40 Toml.
31:41 so the idea behind this was that it was going to be this, configuration file, you
31:46 know, one configuration file to rule them all.
31:48 And of course, we're, by then we like things to be simple.
31:51 Well, ironically, this turned into a really political thing, which I'm still trying to
31:54 wrap my head around.
31:55 So basically the, the, the nice thing about this repository is, is, is, is keeping track
32:01 of all the projects that have adopted pie project.
32:03 Toml, either optionally or mandatory, for configurations.
32:07 So instead of having to have, you know, a dozen configuration files in your project for all
32:11 these different tools, you can just use this one.
32:14 And so it's got this big list.
32:15 What I find interesting is this part down here at the bottom.
32:18 if you go down to, yeah, just scroll just slightly here, just slightly, just
32:23 a little bit up.
32:24 that's going to sound weird on the podcast.
32:25 Anyway, so if you're going to, so these are projects that are quote unquote, discussing
32:31 the use of pie project Toml.
32:32 But if you actually look at these, it's kind of odd.
32:35 you know, the, the big sticking points, cause these are the projects that are like stopping
32:39 people from really just going all in on, on pie project Toml.
32:42 And there's even some, you know, talk about circular, you know, dependencies or somewhere
32:46 like, well, I'll do it when they do it.
32:47 And they're like, well, I will do it when they do it.
32:49 which makes you wonder if it's a serious excuse.
32:51 so my pie is the weirdest.
32:54 We'd have an awesome himself said, well, it doesn't solve anything.
32:57 You know, someone said, can we just add this, please just add it.
32:59 It's easy here.
33:00 Here's the PR.
33:01 Somebody even did the PR.
33:02 He's like, nah, it doesn't solve anything.
33:04 And he closed, he closed it.
33:05 It's like, it does solve something.
33:07 It's one less file I have to deal with.
33:10 That is a solution.
33:11 Blake eight, they have a couple of concrete objections.
33:15 One is the fact we don't have the standard Toml parser in the Python, standard library.
33:20 So that could be, you know, that could be a problem.
33:23 Interesting.
33:23 you're adding another dependency to just support having this format.
33:28 Exactly.
33:29 Yeah.
33:29 but then again, it's, if it's a common dependency with a bunch of other, you know,
33:33 tools that are already in use and it almost doesn't matter.
33:35 pip, someone said, I don't understand this.
33:38 pip to change its behavior.
33:40 So mere presence of the file doesn't change functionality.
33:42 I can't wrap my head around what he's referring to there.
33:45 Maybe a, but the stupid thing is someone already did flake nine, which is a, which an exact fork
33:50 of flake eight that just adds high project Toml.
33:52 So it's like, it's done.
33:54 They just have to merge it.
33:56 But it's, and actually the same thing happened with a bandit.
34:00 someone actually implemented in 2019.
34:02 The PR has been sitting there untouched since 2019.
34:05 So over a year's gone by it's there and bandit is not picking it up.
34:09 They're just, they're silent.
34:10 Read the docs is saying it's too much work.
34:12 like it's a lot of work for us to have the multiple, pie oxidizer shockingly hasn't
34:18 even said anything.
34:18 It's 2019.
34:19 They're, they're like the, they're like the new trendy, like the trend setting packaging
34:25 thing.
34:26 And they haven't been saying anything about this.
34:29 This.
34:29 So I, I'm trying to figure out why it is that this is so controversial because it seems
34:35 so obvious.
34:35 You have one file to store all of the settings for all the different tools.
34:39 and yet everybody seems to want to do their own thing with this.
34:43 Well, I know that, you know, pip and poetry and flit and some of these other tools that
34:50 suggest a workflow.
34:52 I feel like I hear this file format being used along with those and, you know, telling people
34:59 we're going to have a different way for you to like work with your projects and manage
35:02 dependencies and stuff.
35:03 And you know that I think that's part of the source of, of this.
35:06 And I don't know if it's just necessarily all mixed together.
35:09 Brian, what do you think?
35:10 You know more about this than I do.
35:11 I think a lot of projects are on the side of like, for instance, coverage was,
35:18 was it, I don't know where they are on the list.
35:21 That they adopted.
35:22 Did they adopt it?
35:22 Did they adopt it?
35:23 Okay.
35:23 Yeah.
35:23 Well, coverage had this thing in, in other tools we're talking about, you know, there's
35:28 no Toml parser and they, they didn't have any other dependencies.
35:32 So they didn't want to add a third party dependency, just for this.
35:36 And, and if they're just using it for packaging, however, or, or settings or something.
35:41 But, the, so I do, I do think we will see a lot.
35:45 I don't think it's a reasonable argument because, there's, there's reasons why, you know,
35:50 the same thing, reason why request is, because there's making changes.
35:54 But I do think that the, like the format of Toml basic format enough to get a by project,
35:59 isn't going to change much.
36:01 so I think enough of a project, Toml parser to handle by project.
36:07 that's, I think we need one of the, something like that in the, in, in, in built into Python.
36:13 Yeah.
36:13 Especially since we have, we have PEP 5.18.
36:15 So like we have some, we have some standard already.
36:18 Yeah.
36:19 So I think we'll see a big, I would like to see at least, even if it isn't the mainstream
36:24 one, if we have, if the, if most projects that are okay with the third party use something
36:28 else, for a Toml parser, but there's some built in stripped down version in the, the standard
36:35 library.
36:35 I think that that's, I think that's great.
36:37 Yeah.
36:38 I, I, I see you could solve that problem by just bendering it.
36:41 Just like, here's the two files that make up the parser.
36:43 We're just going to make it part of this package.
36:46 So now we're good to go.
36:47 I don't know.
36:47 Sounds good.
36:48 Well, I think that's it for all of our items.
36:50 Brian, you got anything I actually want to share with folks?
36:53 Yeah.
36:53 I'm, it's my birthday.
36:55 Yay.
36:55 Happy birthday.
36:56 Happy birthday, man.
36:57 So I'm looking good for, I was gonna say you're looking good for 28 brother.
37:01 So I'm 51.
37:02 And, I heard today that that's just one.
37:05 I'm just shy of a full deck.
37:08 Well, yeah, I've, I've never been accused of playing with a full deck myself.
37:12 but don't, I will say, don't let anyone tell you that you're old because, it says
37:17 in the first chapter, chapter of Genesis, thou, and then God said, man's year shall be limited
37:21 to 120.
37:22 Half of 120 is 60.
37:24 So what is biblical that 60 is middle age.
37:26 You're not even middle aged.
37:27 You've got a way to go.
37:29 I mean, it's the Bible.
37:33 I keep telling everybody that I don't look at day over 73.
37:36 Oh, you're a good man.
37:38 a couple of happy birthdays.
37:40 And also you're going to ask if you're still a fan of flit.
37:43 Yeah.
37:43 I love flit, especially since they adopted the, source source directory.
37:47 Yeah, that's right.
37:48 That's awesome.
37:49 that's, that's saved my life.
37:50 Jason, anything extra that you want to throw out there?
37:54 I mean, maybe people have a place they could get notified about your upcoming book or
37:58 something like that.
37:58 Yeah.
37:59 You know, following me on Twitter is probably the best way to do that.
38:02 I'm code mouse nine to one Twitter.
38:03 and then, actually I follow no starts press too.
38:07 I mean, no starts press is awesome to begin with.
38:10 That's where you're doing the book.
38:11 Yeah, exactly.
38:12 You're there.
38:12 They're my publisher.
38:13 No search.
38:13 I don't think they ever put out a bad book.
38:16 I love that publisher.
38:17 So, I was, I, I can, you can actually, you can ask my mother when I got, when I got,
38:22 when my book contract got accepted, I actually screamed, very high pitched.
38:27 That's awesome.
38:28 Yeah.
38:29 Yeah.
38:29 Follow, follow those starts press for updates on, on that.
38:32 And all their other awesome, they got some other incredible books coming up too.
38:34 So I'll go ahead and ask her.
38:37 So what's your mom's Twitter handle?
38:38 Oh, my mom's Twitter handle.
38:40 Oh, she doesn't have a Twitter handle actually.
38:42 So I'll have to put you in touch directly.
38:44 I think.
38:45 Awesome.
38:46 Well, cool.
38:49 Thanks for being here again.
38:50 So I have a couple of items to throw out here.
38:53 This almost, Brian, this almost could have been an extra, extra, extra, extra, extra, extra,
38:56 extra here all about it, but they're real short.
38:58 So I didn't do that.
38:59 Django 315 is released.
39:01 Django 3.
39:02 Didn't we just, just go to Django 2 or something?
39:04 That's, I mean, that's good.
39:06 That's really good to hear.
39:07 So awesome.
39:08 That Python 310 alpha 4 is available for testing.
39:11 Yeah, the new parser is going to be in that one, which is going to be.
39:15 Oh, that's the peg parser that Gita's been working on?
39:17 Yeah, that's going to be, that's going to, that's going to revolutionize the language eventually.
39:21 Yeah.
39:21 Yeah.
39:22 It'll definitely make it possible to do more.
39:24 And in releases, SciPy 1.6.0 was released.
39:28 I learned about a cool project.
39:29 So we talked about like avoiding Excel for the Python data science stack, right?
39:35 Like just stop doing Excel.
39:36 There's all these weird errors.
39:37 Like the, the organization that defines or governs how you can name genes has come up
39:44 with rules for names you can't use.
39:46 And the reason they can't be used is they'll be parsed incorrectly into other data types
39:51 by Excel, for example.
39:52 So there's a lot of issues you might run into with Excel and, and that's all good.
39:57 But there's this project called PyXLL and this is actually a paid product.
40:02 They're not sponsoring the show.
40:03 I just think it's kind of neat.
40:04 So spreading the word.
40:06 But anyway, if it's interesting for you, what you can do is it's a plugin for Excel that
40:10 will embed Jupyter into Excel and allow you to write functions and macros in Excel in Python.
40:16 So basically it almost adds the program, Python, the programming language to Excel, which is
40:21 good.
40:21 Yeah.
40:22 It's better than VBA.
40:23 Let's see.
40:24 No, I started in VBA.
40:26 Tell me about it.
40:26 Anything's better than VBA.
40:30 So someone on Twitter asked if PyCharm works okay on my Apple Mac Mini M1.
40:36 And they, PyCharm and JetBrains in general, just released a whole bunch of their tooling
40:41 with different installs for the Apple Silicon native versions.
40:46 And so I've got a cool little video that I'm going to link to in the show notes.
40:50 And it's just like a five second video of here.
40:52 I open up PyCharm and you basically from the time you click on open project till the project's
40:58 open, if you've opened a project before.
40:59 So that caveat.
41:01 But at that point, if you click on it, you cannot perceive click.
41:04 Like by the time you're letting up the mouse, the whole the project is loaded and ready to
41:08 work on.
41:09 It's like it's insane.
41:11 I will I will consider picking up PyCharm again when they add live share into it.
41:15 They have they're they're working on it.
41:16 It's something called code with me.
41:18 Yeah.
41:18 Yeah.
41:18 So I have not tried it.
41:19 I have no one to code with.
41:20 I'm sorry, but email me later.
41:23 We'll set something.
41:23 Yeah, exactly.
41:24 We'll go together.
41:25 So also, since I got my M1 like three, four weeks ago, whatever, I've only used used this
41:32 for all my Python work.
41:33 And apparently it's it's still going strong.
41:36 I even had to send in my MacBook Pro because it had starting started shut.
41:41 The battery was so bad.
41:42 It would shut down at 75 percent.
41:43 Like, you know, when it gets too low, it'll shut down.
41:46 And as the battery gets bad, maybe it shuts down at 10 percent instead of zero.
41:48 If I'm doing video work, it'll actually shut down at 75 percent.
41:52 So I plug it back in.
41:53 So so it's all in one until that comes back.
41:55 Well, I'm I'm still on my system.
41:57 76 Linux.
41:58 I can't speak to Apple.
41:59 I do love my system.
42:00 That's cool.
42:02 I just I think this whole like new arm architecture stuff that they're doing, it's going to be
42:08 interesting.
42:08 You know, I think Microsoft's following suit or trying in parallel with them.
42:12 It just felt to me like Intel and AMD.
42:15 That's just the way it was going to be forever.
42:16 And it's not necessarily the case.
42:18 I don't I don't have a problem with I don't have a problem with competition.
42:21 What I have a problem with is software companies making their own, you know, architecture and
42:25 it only works on their architecture.
42:27 That's what you move towards.
42:28 And then you wind up with a totally fragmented industry.
42:31 I think that's yeah, that's not going to be great.
42:32 Don't do it, Microsoft.
42:34 It's not worth it.
42:35 Awesome.
42:38 All right.
42:38 Well, that that's my extra, extra, extra, extra, extra, extra, right?
42:40 Nice.
42:41 I want to get an M1.
42:43 I'd like to get a mini.
42:44 Yeah, the mini is fantastic.
42:45 I really, really like it.
42:47 It's not even funny.
42:48 It's not even it's not even a joke.
42:49 I'm being serious, but we do need a joke.
42:51 Yes.
42:52 Oh, I have a joke.
42:53 All right.
42:53 Yeah.
42:54 You got the joke this week.
42:55 I actually do have the joke this week.
42:57 Yeah.
42:57 And it was a why, why did the programmer always refuse to check his code into the repository?
43:01 Why?
43:02 He was afraid to commit.
43:03 Yeah.
43:06 Yeah.
43:07 If you want to, if you want a regular dose of my, of my, that is one of my originals.
43:10 If you want a regular dose of my absolutely horrific puns, you can follow me on Twitter,
43:13 your own peril.
43:14 I posted every, every Monday.
43:16 I've got a new one.
43:17 So awesome.
43:17 Nice.
43:18 Yeah.
43:18 Thanks for being on the show.
43:19 Yeah, it was fun.
43:20 Yeah.
43:20 Thanks. See y'all. Thanks everyone out there on the live stream and thanks everyone who listened.