Wie kann ich meinen Python-Code schneller machen?

Hallo,

ich habe gestern in Python ein paar Funktionen geschrieben, die mir ein interessantes Bild ausrechnen sollen. Ich kriege es jedoch nicht hin, dass das Programm einigermaßen schnell läuft und am Ende muss auch die Auflösung darunter leiden

Wenn da mal jemand drüberschauen könnte, wäre das wirklich hilfreich.

import numpy as np
import matplotlib.pyplot as plt
from math import pi, sqrt, atan

#Punkt definieren
class point:
    def __init__(self,x=0,y=0,z=0):
        self.x = x
        self.y = y

    #Operationen
    def __str__(self):
        return "({0},{1})".format(self.x, self.y)

    def __add__(self, other):
        return point(self.x+other.x,self.y+other.y)

    def __sub__(self, other):
        return point(self.x - other.x, self.y - other.y)

    def __abs__(self):
        return sqrt(self.x**2 + self.y**2)

    def __mul__(self, other):
        if type(other) == point:
            return point(self.x * other.x, self.y * other.y)
        return point(self.x * other, self.y * other)

    def __truediv__(self, other):
        if type(other) == point:
            return point(self.x / other.x, self.y / other.y)
        return point(self.x / other, self.y / other)

    def __neg__(self):
        return point(-self.x,-self.y)

# weitere Funktionen für Punkte
def dis(PointA,PointB):
    return abs(PointB-PointA)

def dir(PointA,PointB):
    return (PointB-PointA)/dis(PointA,PointB)


#Funktion für den Wert
def grav_v(x,y,time=5,frames=60):
    p = point(-1,0)
    sp = point(x+1,y)

    c = point(0,0)
    sc = point(0,0)
    
    #Vielleicht wegen des for-loops so langsam?
    for k in range(frames*time):
        try:
            plus = dir(p,c) * 1/dis(p,c)**2 / frames
            sp += plus
            p += sp/frames
            sc -= plus
            c += sc/frames
        except:
            pass

    return p


#Funktion für das Bild
def grav_c(a=-4, b=4, smoothness=1):
    ROWS = []
    p = 0
    print(0)
    #zwei for-loops...
    for Y in np.linspace(a,b,int(200*smoothness)):
        row = []
        for X in np.linspace(a,b,int(200*smoothness)):
            g = grav_v(X, Y)
            row.append( (abs(atan(g.x)*2/pi), abs(atan(g.y)*2/pi), abs(atan(abs(g))*2/pi)) )
        ROWS.append(row)
        p += 1
        print(p / (200 * smoothness))
    plt.imshow(ROWS, extent=(a, b, a, b))
    plt.show()

grav_c()
Computer, Programm, programmieren, Effizienz, Informatik, Programmiersprache, Python
Wie kann ich in einer While Schleife mit If-Bedingungen einen Namen überprüfen?

Ich muss für die Schule, in der Programmiersprache "Python" ein sogenanntes "Textadventure" schreiben. Dabei soll man am Anfang einen Vornamen eingeben. (mit input)

Der Vorname soll ohne Zahlen, Leerzeichen und Sonderzeichen durch kommen. Sprich nur in Buchstaben. Mit isalpha() kann man das tuen. Der Name soll mindestens 3 Buchstaben groß sein. Dies funktioniert mit len().

Mein Problem ist, das ich nicht weiß, wie ich das umsetzten soll.

CODE:

while True:
    vorname = input("Vorname: ")
    if len(vorname) > 2 and vorname.isalpha():
      break
    elif len(vorname) <= 3:
        print("Bitte einen Namen eingeben, der mindestens 3 Buchstaben enthält!")
        print("")
    else:
      print("Keine Leerzeile, Zahlen, Sonderzeichen! Bitte nur ein Namen eingeben!")
      print("")

OUTPUT:

---------------------
Vorname: A
Bitte einen Namen eingeben, der mindestens 3 Buchstaben enthält!
⠀
Vorname: #
Bitte einen Namen eingeben, der mindestens 3 Buchstaben enthält!
⠀
Vorname: Mia
...
(klappt)

Beim OUTPUT fragte mich das Terminal nach den Vornamen. Wo ich "A" eingegeben habe, kam was ich wollte entsprechend raus.

Und hier ist jetzt mein Problem. Wenn ich Sonderzeichen (in dem Falle eine Rautetaste "#") eingebe, soll mir nicht:

"Bitte einen Namen eingeben, der mindestens 3 Buchstaben enthält!"

angegeben werden, sondern:

"Keine Leerzeile, Zahlen, Sonderzeichen! Bitte nur ein Namen eingeben!".

Ich hoffe, ihr könnt mir dabei helfen!! MfG!

Computer, programmieren, Informatik, Python
Java Zufallszahlen ohne Zurücklegen?

Für ein Teil eines größeren Projekts muss in in Java eine bestimmte Menge an Zufallszahlen erstellen, wobei sich keine doppeln darf.

Zuerst erstelle ich das neue Objekt "zufallszahl" der Klasse "Random".

In der äußeren For-Schleife wird dann für den Index "a" des Arrays "zufallsPosition[]" eine Zufallszahl erzeugt.

Die innere For-Schleife startet ebenfalls beim Anfangswert und läuft solange die Zählvariable "b" kleiner als die Summe aus dem aktuellen "a" und dem Startwert ist. Somit werden alle Indizes durchlaufen, die durch die vorherigen Durchgänge der äußeren For-Schleife schon eine Zufallszahl besitzen.

In der While Schleife wird dann geschaut, ob der Wert des Index "a" (also der oben erzeugten Zufallszahl) dem jeweiligen Wert des Index "b", also den vorherigen Zufallszahlen entspricht. Ist dies der Fall, bekommt das Array an der Stelle "a" eine neue Zufallszahl zugewiesen. Dies passiert (zumindest theoretisch) solange die aktuelle Zufallszahl "a" der aus der inneren For-Schleife "b" entspircht.

Es würde also bedeuten, dass er immer eine neue Zufallszahl erstellt, wenn diese schon im Array vorhanden ist.

Leider funktioniert das nicht und ich weiß selbst nach längerem Überlegen nicht warum :-(

Dann habe ich mal testweise das "==" in der While-Schleife durch ein "!=" ersetzt, d.h. es wird immer eine neue Zufallszahl erstellt bis sie der vorherigen entspricht, was überraschender Weise funktioniert (beispielsweise haben dann alle Indizes den Wert 4).

Code:

"==" in der While Schleife (so, wie es im Code steht)

"!=" in der While Schleife, funktioniert wie gewünscht.

Vielen Dank für Eure Hilfe!

Bild zum Beitrag
Computer, programmieren, Java, Informatik
Java - Arrays, Getter und Setter?

Und zwar muss ich in einem Programm zwei Pizzen anlegen, mit jeweils zwei verschiedenen Preisen und Durchmessern: Als Beispiel: sagen wir mal Pizza 0 ist eine Pizza Margherita mit 26cm Durchmesser für 4€ und mit 30cm Durchmesser für 6€, und Pizza 1 ist eine Pizza Salami mit 30cm für 5€ und mit 32cm für 7€.

Das ganze soll über mehrere Klassen und mit Konstruktoren/Gettern und Settern laufen. Ist nicht weiter schwer, jedoch habe ich da ein Problem: Für die Pizzen an sich habe ich ein Array angelegt mit der Länge 2. Für die Durchmesser und Preise jeweils ein Array mit 4 Stellen. Die ersten beiden Stellen dieser Arrays gehören Pizza 0, die letzten beiden Pizza 1.

Um die Werte zu speichern habe ich ganz einfach über den Konstruktor den gesamten Array mit den Durchmessern/Preisen übergeben. Der Durchmesser Array hätte dann in diesem Fall folgende Werte: 26, 28, 30, 32.

Um die Werte auszugeben, habe ich dann sowas geschrieben wie pizza[0].getDurchmesser(0 und 1) und pizza[1].getDurchmesser(2 und 3). Die Ziffern in den Klammern sind die jeweilige Stelle im Durchmesser-/Preis Array.

Mein Problem ist nun, dass das Array, das Durchmesser/Preise speichert, 4 Stellen lang ist. Man könnte problemlos als Ausgabe pizza[0].getDurchmesser(2) schreiben, womit die Margherita einen Durchmesser von 30cm hätte, obwohl sie nur 26 oder 28 haben darf. Ich frage mich, ob mein Lösungsweg dennoch so passt und man einfach falsche Ausgaben im Code vermeiden soll, oder ob es eine bessere Lösung gibt, mit der sowas nicht vorkommen kann. Ein anderer Weg fällt mir allerdings leider nicht ein (bin nicht wirklich der erfahrenste Programmierer).

Ich hoffe, dass mir jemand helfen kann!

Computer, programmieren, Java, Informatik
Java- "Verbindungsaufbau abgelehnt"?

Hallo, hier der Code erstmal :

package EmailSending;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail555
{
    public static void main(String [] args){
        String to = "z";//change accordingly
        String from = "y"; //change accordingly
        String host = "x";//or IP address

        //Get the session object
        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);
        Session session = Session.getDefaultInstance(properties);

        //compose the message
        try{
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
            message.setSubject("Ping");
            message.setText("Hello, this is example of sending email  ");

            // Send message
            Transport.send(message);
            System.out.println("message sent successfully....");

        }catch (MessagingException mex) {mex.printStackTrace();}
    }
}

Und dann kommt diese Fehlermeldung :

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: xyz; timeout -1;
 nested exception is:
   java.net.ConnectException: Verbindungsaufbau abgelehnt
   at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2209)
   at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740)
   at javax.mail.Service.connect(Service.java:366)
   at javax.mail.Service.connect(Service.java:246)
   at javax.mail.Service.connect(Service.java:195)
   at javax.mail.Transport.send0(Transport.java:254)
   at javax.mail.Transport.send(Transport.java:124)
   at EmailSending.SendEmail555.main(SendEmail555.java:29)
Caused by: java.net.ConnectException: Verbindungsaufbau abgelehnt
   at java.base/sun.nio.ch.Net.connect0(Native Method)
   at java.base/sun.nio.ch.Net.connect(Net.java:579)
   at java.base/sun.nio.ch.Net.connect(Net.java:568)
   at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
   at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
   at java.base/java.net.Socket.connect(Socket.java:633)
   at java.base/java.net.Socket.connect(Socket.java:583)
   at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:359)
   at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
   at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175)
   ... 7 more

Was habe ich falsch gemacht ? Immer kommt dieser Fehler, der Verbindungsaufbau würde abgelehnt werden...

PC, Computer, IT, programmieren, Java, Informatik
In C: Celsius in Fahrenheit?

Moin,

ich habe ein Programm geschrieben, welches Celsius in Fahrenheit umrechnet. Jedoch bekomme ich nicht die richtigen Ergebnisse, da ich ja rein theoretisch die Ergebnisse der Rechnung (Formel für Umrechnung: Temp(in Celsius) * 9/5 + 32 in einer float-Variable speichern müsste, oder?

Hier meine Header:

#ifndef TEMPERATURE
#define TEMPERATURE

#define MAX_LENGTH 10

#define converter(c)((c * (9 / 5)) + 32)

double output_temperatures(double temp[]);
int string_length(double temp[]);
double widening(double temp2[]);
/* double appendix(double temp3[], temp4[]); */

#endif

Hier meine Funktionen:

#include "aufgabe2930b.h"
#include <stdio.h>

double output_temperatures(double temp[])
{
  int i;
  printf("Temperaturen in Fahrenheit: ");

  for (i = 0; i < string_length(temp); ++i) {
    if (temp[i] <= 100 && temp[i] >= -273.15) {
      printf("%f  ", converter(temp[i]));
    }
    else {
      printf("Falsche Eingabe! ");
      break;
    }
  }

  printf("\n");
  return 0;
}

int string_length(double temp[])
{
  int i = 0;
  int length = 0;

  while (temp[i] != '\0') {
    ++length;
    ++i;
  }

  return length;
}

double widening(double temp[])
{
  int i = 0;

  while (i < MAX_LENGTH - 1) {
    if (temp[i] == '\0') {
      printf("Bitte anzuhängende Temperatur eingeben: ");
      scanf("%lf", &temp[i]);
      temp[i + 1] = '\0';
      break;
    }
    else {
      ++i;
    }
  }

  for (i = 0 ; i < string_length(temp); ++i) {
    if (temp[i] <= 100 && temp[i] >= -273.15) {
      printf("%f  ", converter(temp[i]));
    }
    else {
      printf("Falsche Eingabe! ");
      break;
    }
  }

  return 0;
}

Hier meine main:

#include <stdio.h>
#include "aufgabe2930b.h"

int main(void)
{
  double temp[MAX_LENGTH] = { 1, 2 };
  output_temperatures(temp);
  widening(temp);

  return 0;
}
Temperatur, programmieren, Informatik
Sicherheitsprüfung (SÜ2) in der IT. Trunkenheit am Steuer?

Alter: 27

Moin,

hatte heute ein Vorstellungsgespräch für eine Ausbildung bei eines der Größten Staatlichen IT Unternehmen in Hamburg.

Das Gespräch lief richtig gut.

Am ende hat sie dann was von Sicherheitsüberprüfung gesagt, (denke SÜ2, weil sie etwas von 5 Jahren gesagt hat) und ich meinte, dass es kein Problem sei, weil mein Führungszeugnis ja auch sauber ist (hab ich dieses Jahr schon bestellt).

Leider ist mir mit der Recherche eingefallen, dass ich doch vor 4 Jahren ein verfahren wegen Alkohol am Steuer hatte mi 1,8 Promille und mir mein FS entzogen wurde, den ich dann mit der MPU wieder erlangte.

Jetzt habe ich echt schiss, dass ich die Ausbildung doch nicht bekomme :(

Möchte Fachinformatiker für Systemintegration werden, habe schon eine Ausbildung hinter mir (Kaufmann im Einzelhandel) und habe wirklich mega bock darauf, weil es auch noch mein Kindheitswunsch ist, in der IT zu arbeiten.

Dieser Traum könnte jetzt, obwohl es so gut läuft, platzen.

Kann mir einer sagen, ob darauf wirklich Wert gelegt wird, weil ich meine, ich arbeite ja in der IT und nichtals Fahrer oder so, obwphl ich davor auch schon als Fahrer tätig wurde, aber dort wurde ja nur nach dem Führungszeugnis gefragt und der ist ja wie gesagt sauber.

Vielen Dank im vorraus.

IT, Führungszeugnis, Informatik, Straftat, bundeszentralregister, erweitertes führungszeugnis, Trunkenheit am Steuer, Ausbildung und Studium
Wie schnell sind Qbits?

Guten Abend,

ich befasse mich momentan intensiv mit dem Thema Quantencomputer, da ich diese Woche noch einen Vortrag dazu halten werde. Ich möchte eine Formel, mit welcher ich zeigen kann, wie viel schneller Qbits als Bits sind. Qbits habe ich dabei so verstanden, dass diese in ihrer Superposition zwei verschiedene Werte annehmen könnten 0 und 1. Des Weiteren können sie miteinander verschränkt sein, was diesen Effekt exponentiell verstärkt. Trotzdem heißt es immer Qbits können 2^n viele Bit-Zustände annehmen, was jedoch genauso viele wären, wie normale Bits oder? Auf einer Info-Seite http://www.quantencomputer-info.de/quantencomputer/quantencomputer-einfach-erklaert/ habe ich noch eine andere herangehensweise gefunden.

Hier wurde gesagt, dass es 256 Bits bedürfte um 1 Qbit darzustellen. Dieser Wert würde sich mit jedem Qbit verdoppeln. Daraus habe ich dann folgende Formel abgeleitet: 256*2^(n-1). Trotzdem bin ich mir jetzt nicht sicher, welche ich für den Wow-Effekt verwenden soll.

Vielleicht verstehe ich die erste Formel 2^n auch falsch und die angezeigten Bit-Zustände stehen für die gleichzeitig annehmbaren zustände, was natürlich deutlich schneller wären als Bits. Z.B. 2^3 Bits können zwar 8 Zustände annehmen, aber bilden halt nur einen wieder. 2^3 Qbits hingegen nehmen alle 8 Zustände gleichzeitig an und entscheiden sich dann für die richtige.

Ich hoffe ihr könnt mir da etwas Klarheit verschaffen

LG

Computer, Informatik, Physik, Quantenphysik, theoretische Physik, Quantencomputer

Meistgelesene Beiträge zum Thema Informatik